114 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import logging
 | |
| import typing
 | |
| 
 | |
| logger = logging.getLogger("Subnautica")
 | |
| 
 | |
| from .Locations import lookup_name_to_id as locations_lookup_name_to_id
 | |
| from .Items import item_table, lookup_name_to_item, advancement_item_names
 | |
| from .Items import lookup_name_to_id as items_lookup_name_to_id
 | |
| 
 | |
| from .Regions import create_regions
 | |
| from .Rules import set_rules
 | |
| from .Options import options
 | |
| 
 | |
| from BaseClasses import Region, Entrance, Location, MultiWorld, Item, Tutorial
 | |
| from ..AutoWorld import World, WebWorld
 | |
| 
 | |
| 
 | |
| class SubnaticaWeb(WebWorld):
 | |
|     tutorials = [Tutorial(
 | |
|         "Multiworld Setup Guide",
 | |
|         "A guide to setting up the Subnautica randomizer connected to an Archipelago Multiworld",
 | |
|         "English",
 | |
|         "setup_en.md",
 | |
|         "setup/en",
 | |
|         ["Berserker"]
 | |
|     )]
 | |
| 
 | |
| 
 | |
| class SubnauticaWorld(World):
 | |
|     """
 | |
|     Subnautica is an undersea exploration game. Stranded on an alien world, you become infected by
 | |
|     an unknown bacteria. The planet's automatic quarantine will shoot you down if you try to leave.
 | |
|     You must find a cure for yourself, build an escape rocket, and leave the planet.
 | |
|     """
 | |
|     game: str = "Subnautica"
 | |
|     web = SubnaticaWeb()
 | |
| 
 | |
|     item_name_to_id = items_lookup_name_to_id
 | |
|     location_name_to_id = locations_lookup_name_to_id
 | |
|     options = options
 | |
| 
 | |
|     data_version = 2
 | |
|     required_client_version = (0, 1, 9)
 | |
| 
 | |
|     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
 | |
|         extras = 0
 | |
|         valuable = self.world.item_pool[self.player] == "valuable"
 | |
|         for item in item_table:
 | |
|             for i in range(item["count"]):
 | |
|                 subnautica_item = self.create_item(item["name"])
 | |
|                 if item["name"] == "Neptune Launch Platform":
 | |
|                     neptune_launch_platform = subnautica_item
 | |
|                 elif valuable and not item["progression"]:
 | |
|                     self.world.push_precollected(subnautica_item)
 | |
|                     extras += 1
 | |
|                 else:
 | |
|                     pool.append(subnautica_item)
 | |
| 
 | |
|         for item_name in self.world.random.choices(sorted(advancement_item_names - {"Neptune Launch Platform"}),
 | |
|                                                    k=extras):
 | |
|             item = self.create_item(item_name)
 | |
|             item.advancement = False  # as it's an extra, just fast-fill it somewhere
 | |
|             pool.append(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 fill_slot_data(self):
 | |
|         slot_data = {}
 | |
|         return slot_data
 | |
| 
 | |
|     def create_item(self, name: str) -> Item:
 | |
|         item = lookup_name_to_item[name]
 | |
|         return SubnauticaItem(name, item["progression"], item["id"], player=self.player)
 | |
| 
 | |
| 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"
 | |
| 
 | |
| 
 | |
| class SubnauticaItem(Item):
 | |
|     game = "Subnautica"
 | 
