| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  | import typing | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from .Locations import location_table, lookup_name_to_id as locations_lookup_name_to_id | 
					
						
							|  |  |  | from .Items import (createResourcePackName, item_table, progressive_table, progressive_item_list, | 
					
						
							|  |  |  |     lookup_name_to_item, resourcepack_items as resourcePackItems, lookup_name_to_id as items_lookup_name_to_id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from .Regions import create_regions, getConnectionName | 
					
						
							|  |  |  | from .Rules import set_rules | 
					
						
							| 
									
										
										
										
											2024-07-15 06:09:02 -07:00
										 |  |  | from .Options import RaftOptions | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-13 18:06:43 -06:00
										 |  |  | from BaseClasses import Region, Entrance, Location, MultiWorld, Item, ItemClassification, Tutorial | 
					
						
							| 
									
										
										
										
											2022-05-11 13:05:53 -05:00
										 |  |  | from ..AutoWorld import World, WebWorld | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class RaftWeb(WebWorld): | 
					
						
							| 
									
										
										
										
											2023-06-14 15:30:14 -07:00
										 |  |  |     theme = "ocean" | 
					
						
							| 
									
										
										
										
											2022-05-11 13:05:53 -05:00
										 |  |  |     tutorials = [Tutorial( | 
					
						
							|  |  |  |         "Multiworld Setup Guide", | 
					
						
							|  |  |  |         "A guide to setting up Raft integration for Archipelago multiworld games.", | 
					
						
							|  |  |  |         "English", | 
					
						
							|  |  |  |         "setup_en.md", | 
					
						
							|  |  |  |         "setup/en", | 
					
						
							|  |  |  |         ["SunnyBat", "Awareqwx"] | 
					
						
							|  |  |  |     )] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class RaftWorld(World): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Raft is a flooded world exploration game. You're stranded on a small raft in the middle of the | 
					
						
							|  |  |  |     ocean, and you must survive on trash floating by you on the top of the water and around/on any | 
					
						
							|  |  |  |     islands that you come across. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     game: str = "Raft" | 
					
						
							| 
									
										
										
										
											2022-05-11 13:05:53 -05:00
										 |  |  |     web = RaftWeb() | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     item_name_to_id = items_lookup_name_to_id.copy() | 
					
						
							|  |  |  |     lastItemId = max(filter(lambda val: val is not None, item_name_to_id.values())) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     location_name_to_id = locations_lookup_name_to_id | 
					
						
							| 
									
										
										
										
											2024-07-15 06:09:02 -07:00
										 |  |  |     options_dataclass = RaftOptions | 
					
						
							|  |  |  |     options: RaftOptions | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-05 19:37:08 -07:00
										 |  |  |     required_client_version = (0, 3, 4) | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-14 15:30:14 -07:00
										 |  |  |     def create_items(self): | 
					
						
							| 
									
										
										
										
											2024-07-15 06:09:02 -07:00
										 |  |  |         minRPSpecified = self.options.minimum_resource_pack_amount.value | 
					
						
							|  |  |  |         maxRPSpecified = self.options.maximum_resource_pack_amount.value | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  |         minimumResourcePackAmount = min(minRPSpecified, maxRPSpecified) | 
					
						
							|  |  |  |         maximumResourcePackAmount = max(minRPSpecified, maxRPSpecified) | 
					
						
							| 
									
										
										
										
											2024-07-15 06:09:02 -07:00
										 |  |  |         isFillingFrequencies = self.options.island_frequency_locations.is_filling_frequencies_in_world() | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  |         # Generate item pool | 
					
						
							|  |  |  |         pool = [] | 
					
						
							| 
									
										
										
										
											2023-06-20 00:14:46 -07:00
										 |  |  |         frequencyItems = [] | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  |         for item in item_table: | 
					
						
							|  |  |  |             raft_item = self.create_item_replaceAsNecessary(item["name"]) | 
					
						
							| 
									
										
										
										
											2023-07-04 12:28:09 -07:00
										 |  |  |             if isFillingFrequencies and "Frequency" in item["name"]: | 
					
						
							| 
									
										
										
										
											2023-06-20 00:14:46 -07:00
										 |  |  |                 frequencyItems.append(raft_item) | 
					
						
							| 
									
										
										
										
											2023-07-04 12:28:09 -07:00
										 |  |  |             else: | 
					
						
							|  |  |  |                 pool.append(raft_item) | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         extraItemNamePool = [] | 
					
						
							|  |  |  |         extras = len(location_table) - len(item_table) - 1 # Victory takes up 1 unaccounted-for slot | 
					
						
							|  |  |  |         if extras > 0: | 
					
						
							| 
									
										
										
										
											2024-07-15 06:09:02 -07:00
										 |  |  |             if (self.options.filler_item_types != self.options.filler_item_types.option_duplicates): # Use resource packs | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  |                 for packItem in resourcePackItems: | 
					
						
							|  |  |  |                     for i in range(minimumResourcePackAmount, maximumResourcePackAmount + 1): | 
					
						
							|  |  |  |                         extraItemNamePool.append(createResourcePackName(i, packItem)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-15 06:09:02 -07:00
										 |  |  |             if self.options.filler_item_types != self.options.filler_item_types.option_resource_packs: # Use duplicate items | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  |                 dupeItemPool = item_table.copy() | 
					
						
							|  |  |  |                 # Remove frequencies if necessary | 
					
						
							| 
									
										
										
										
											2024-07-15 06:09:02 -07:00
										 |  |  |                 if self.options.island_frequency_locations != self.options.island_frequency_locations.option_anywhere: # Not completely random locations | 
					
						
							| 
									
										
										
										
											2023-06-20 00:14:46 -07:00
										 |  |  |                     # If we let frequencies stay in with progressive-frequencies, the progressive-frequency item | 
					
						
							|  |  |  |                     # will be included 7 times. This is a massive flood of progressive-frequency items, so we | 
					
						
							|  |  |  |                     # instead add progressive-frequency as its own item a smaller amount of times to prevent | 
					
						
							|  |  |  |                     # flooding the duplicate item pool with them. | 
					
						
							| 
									
										
										
										
											2024-07-15 06:09:02 -07:00
										 |  |  |                     if self.options.island_frequency_locations == self.options.island_frequency_locations.option_progressive: | 
					
						
							| 
									
										
										
										
											2023-06-20 00:14:46 -07:00
										 |  |  |                         for _ in range(2): | 
					
						
							|  |  |  |                             # Progressives are not in item_pool, need to create faux item for duplicate item pool | 
					
						
							|  |  |  |                             # This can still be filtered out later by duplicate_items setting | 
					
						
							|  |  |  |                             dupeItemPool.append({ "name": "progressive-frequency", "progression": True }) # Progressive frequencies need to be included | 
					
						
							|  |  |  |                     # Always remove non-progressive Frequency items | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  |                     dupeItemPool = (itm for itm in dupeItemPool if "Frequency" not in itm["name"]) | 
					
						
							|  |  |  |                  | 
					
						
							|  |  |  |                 # Remove progression or non-progression items if necessary | 
					
						
							| 
									
										
										
										
											2024-07-15 06:09:02 -07:00
										 |  |  |                 if (self.options.duplicate_items == self.options.duplicate_items.option_progression): # Progression only | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  |                     dupeItemPool = (itm for itm in dupeItemPool if itm["progression"] == True) | 
					
						
							| 
									
										
										
										
											2024-07-15 06:09:02 -07:00
										 |  |  |                 elif (self.options.duplicate_items == self.options.duplicate_items.option_non_progression): # Non-progression only | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  |                     dupeItemPool = (itm for itm in dupeItemPool if itm["progression"] == False) | 
					
						
							|  |  |  |                  | 
					
						
							|  |  |  |                 dupeItemPool = list(dupeItemPool) | 
					
						
							|  |  |  |                 # Finally, add items as necessary | 
					
						
							|  |  |  |                 if len(dupeItemPool) > 0: | 
					
						
							|  |  |  |                     for item in dupeItemPool: | 
					
						
							|  |  |  |                         extraItemNamePool.append(item["name"]) | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |             if (len(extraItemNamePool) > 0): | 
					
						
							| 
									
										
										
										
											2023-11-09 08:47:36 +01:00
										 |  |  |                 for randomItem in self.random.choices(extraItemNamePool, k=extras): | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  |                     raft_item = self.create_item_replaceAsNecessary(randomItem) | 
					
						
							|  |  |  |                     pool.append(raft_item) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-31 21:41:21 -05:00
										 |  |  |         self.multiworld.itempool += pool | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-04 12:28:09 -07:00
										 |  |  |         # Victory item | 
					
						
							|  |  |  |         self.multiworld.get_location("Utopia Complete", self.player).place_locked_item( | 
					
						
							|  |  |  |             RaftItem("Victory", ItemClassification.progression, None, player=self.player)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-09 00:57:34 +00:00
										 |  |  |         if frequencyItems: | 
					
						
							|  |  |  |             self.place_frequencyItems(frequencyItems) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  |     def set_rules(self): | 
					
						
							| 
									
										
										
										
											2022-10-31 21:41:21 -05:00
										 |  |  |         set_rules(self.multiworld, self.player) | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def create_regions(self): | 
					
						
							| 
									
										
										
										
											2022-10-31 21:41:21 -05:00
										 |  |  |         create_regions(self.multiworld, self.player) | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  |      | 
					
						
							|  |  |  |     def create_item_replaceAsNecessary(self, name: str) -> Item: | 
					
						
							|  |  |  |         isFrequency = "Frequency" in name | 
					
						
							| 
									
										
										
										
											2024-07-15 06:09:02 -07:00
										 |  |  |         shouldUseProgressive = bool((isFrequency and self.options.island_frequency_locations == self.options.island_frequency_locations.option_progressive) | 
					
						
							|  |  |  |             or (not isFrequency and self.options.progressive_items)) | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  |         if shouldUseProgressive and name in progressive_table: | 
					
						
							|  |  |  |             name = progressive_table[name] | 
					
						
							|  |  |  |         return self.create_item(name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def create_item(self, name: str) -> Item: | 
					
						
							|  |  |  |         item = lookup_name_to_item[name] | 
					
						
							| 
									
										
										
										
											2022-06-17 03:23:27 +02:00
										 |  |  |         return RaftItem(name, ItemClassification.progression if item["progression"] else ItemClassification.filler, | 
					
						
							|  |  |  |                         self.item_name_to_id[name], player=self.player) | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  |      | 
					
						
							|  |  |  |     def create_resourcePack(self, rpName: str) -> Item: | 
					
						
							| 
									
										
										
										
											2022-06-17 03:23:27 +02:00
										 |  |  |         return RaftItem(rpName, ItemClassification.filler, self.item_name_to_id[rpName], player=self.player) | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  |      | 
					
						
							|  |  |  |     def collect_item(self, state, item, remove=False): | 
					
						
							| 
									
										
										
										
											2023-09-15 00:30:46 -07:00
										 |  |  |         if item.advancement is False: | 
					
						
							|  |  |  |             return None | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  |         if item.name in progressive_item_list: | 
					
						
							|  |  |  |             prog_table = progressive_item_list[item.name] | 
					
						
							|  |  |  |             if remove: | 
					
						
							|  |  |  |                 for item_name in reversed(prog_table): | 
					
						
							|  |  |  |                     if state.has(item_name, item.player): | 
					
						
							|  |  |  |                         return item_name | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 for item_name in prog_table: | 
					
						
							|  |  |  |                     if not state.has(item_name, item.player): | 
					
						
							|  |  |  |                         return item_name | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return super(RaftWorld, self).collect_item(state, item, remove) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-09 00:57:34 +00:00
										 |  |  |     def place_frequencyItems(self, frequencyItems): | 
					
						
							|  |  |  |         def setLocationItem(location: str, itemName: str): | 
					
						
							|  |  |  |             itemToUse = next(filter(lambda itm: itm.name == itemName, frequencyItems)) | 
					
						
							|  |  |  |             frequencyItems.remove(itemToUse) | 
					
						
							|  |  |  |             self.get_location(location).place_locked_item(itemToUse) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def setLocationItemFromRegion(region: str, itemName: str): | 
					
						
							|  |  |  |             itemToUse = next(filter(lambda itm: itm.name == itemName, frequencyItems)) | 
					
						
							|  |  |  |             frequencyItems.remove(itemToUse) | 
					
						
							|  |  |  |             location = self.random.choice(list(loc for loc in location_table if loc["region"] == region)) | 
					
						
							|  |  |  |             self.get_location(location["name"]).place_locked_item(itemToUse) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-15 06:09:02 -07:00
										 |  |  |         if self.options.island_frequency_locations == self.options.island_frequency_locations.option_vanilla: | 
					
						
							| 
									
										
										
										
											2024-12-09 00:57:34 +00:00
										 |  |  |             setLocationItem("Radio Tower Frequency to Vasagatan", "Vasagatan Frequency") | 
					
						
							|  |  |  |             setLocationItem("Vasagatan Frequency to Balboa", "Balboa Island Frequency") | 
					
						
							|  |  |  |             setLocationItem("Relay Station quest", "Caravan Island Frequency") | 
					
						
							|  |  |  |             setLocationItem("Caravan Island Frequency to Tangaroa", "Tangaroa Frequency") | 
					
						
							|  |  |  |             setLocationItem("Tangaroa Frequency to Varuna Point", "Varuna Point Frequency") | 
					
						
							|  |  |  |             setLocationItem("Varuna Point Frequency to Temperance", "Temperance Frequency") | 
					
						
							|  |  |  |             setLocationItem("Temperance Frequency to Utopia", "Utopia Frequency") | 
					
						
							| 
									
										
										
										
											2024-07-15 06:09:02 -07:00
										 |  |  |         elif self.options.island_frequency_locations == self.options.island_frequency_locations.option_random_on_island: | 
					
						
							| 
									
										
										
										
											2024-12-09 00:57:34 +00:00
										 |  |  |             setLocationItemFromRegion("RadioTower", "Vasagatan Frequency") | 
					
						
							|  |  |  |             setLocationItemFromRegion("Vasagatan", "Balboa Island Frequency") | 
					
						
							|  |  |  |             setLocationItemFromRegion("BalboaIsland", "Caravan Island Frequency") | 
					
						
							|  |  |  |             setLocationItemFromRegion("CaravanIsland", "Tangaroa Frequency") | 
					
						
							|  |  |  |             setLocationItemFromRegion("Tangaroa", "Varuna Point Frequency") | 
					
						
							|  |  |  |             setLocationItemFromRegion("Varuna Point", "Temperance Frequency") | 
					
						
							|  |  |  |             setLocationItemFromRegion("Temperance", "Utopia Frequency") | 
					
						
							| 
									
										
										
										
											2024-07-15 06:09:02 -07:00
										 |  |  |         elif self.options.island_frequency_locations in [ | 
					
						
							|  |  |  |             self.options.island_frequency_locations.option_random_island_order, | 
					
						
							|  |  |  |             self.options.island_frequency_locations.option_random_on_island_random_order | 
					
						
							|  |  |  |         ]: | 
					
						
							| 
									
										
										
										
											2022-09-03 12:25:04 -07:00
										 |  |  |             locationToFrequencyItemMap = { | 
					
						
							|  |  |  |                 "Vasagatan": "Vasagatan Frequency", | 
					
						
							|  |  |  |                 "BalboaIsland": "Balboa Island Frequency", | 
					
						
							|  |  |  |                 "CaravanIsland": "Caravan Island Frequency", | 
					
						
							|  |  |  |                 "Tangaroa": "Tangaroa Frequency", | 
					
						
							|  |  |  |                 "Varuna Point": "Varuna Point Frequency", | 
					
						
							|  |  |  |                 "Temperance": "Temperance Frequency", | 
					
						
							|  |  |  |                 "Utopia": "Utopia Frequency" | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             locationToVanillaFrequencyLocationMap = { | 
					
						
							|  |  |  |                 "RadioTower": "Radio Tower Frequency to Vasagatan", | 
					
						
							|  |  |  |                 "Vasagatan": "Vasagatan Frequency to Balboa", | 
					
						
							|  |  |  |                 "BalboaIsland": "Relay Station quest", | 
					
						
							|  |  |  |                 "CaravanIsland": "Caravan Island Frequency to Tangaroa", | 
					
						
							|  |  |  |                 "Tangaroa": "Tangaroa Frequency to Varuna Point", | 
					
						
							|  |  |  |                 "Varuna Point": "Varuna Point Frequency to Temperance", | 
					
						
							|  |  |  |                 "Temperance": "Temperance Frequency to Utopia" | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             # Utopia is never chosen until the end, otherwise these are chosen randomly | 
					
						
							|  |  |  |             availableLocationList = ["Vasagatan", "BalboaIsland", "CaravanIsland", "Tangaroa", "Varuna Point", "Temperance", "Utopia"] | 
					
						
							|  |  |  |             previousLocation = "RadioTower" | 
					
						
							|  |  |  |             while (len(availableLocationList) > 0): | 
					
						
							|  |  |  |                 if (len(availableLocationList) > 1): | 
					
						
							| 
									
										
										
										
											2023-11-09 08:47:36 +01:00
										 |  |  |                     currentLocation = availableLocationList[self.random.randint(0, len(availableLocationList) - 2)] | 
					
						
							| 
									
										
										
										
											2022-09-03 12:25:04 -07:00
										 |  |  |                 else: | 
					
						
							|  |  |  |                     currentLocation = availableLocationList[0] # Utopia (only one left in list) | 
					
						
							|  |  |  |                 availableLocationList.remove(currentLocation) | 
					
						
							| 
									
										
										
										
											2024-07-15 06:09:02 -07:00
										 |  |  |                 if self.options.island_frequency_locations == self.options.island_frequency_locations.option_random_island_order: | 
					
						
							| 
									
										
										
										
											2024-12-09 00:57:34 +00:00
										 |  |  |                     setLocationItem(locationToVanillaFrequencyLocationMap[previousLocation], locationToFrequencyItemMap[currentLocation]) | 
					
						
							| 
									
										
										
										
											2024-07-15 06:09:02 -07:00
										 |  |  |                 elif self.options.island_frequency_locations == self.options.island_frequency_locations.option_random_on_island_random_order: | 
					
						
							| 
									
										
										
										
											2024-12-09 00:57:34 +00:00
										 |  |  |                     setLocationItemFromRegion(previousLocation, locationToFrequencyItemMap[currentLocation]) | 
					
						
							| 
									
										
										
										
											2022-09-03 12:25:04 -07:00
										 |  |  |                 previousLocation = currentLocation | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2022-07-05 19:37:08 -07:00
										 |  |  |     def fill_slot_data(self): | 
					
						
							|  |  |  |         return { | 
					
						
							| 
									
										
										
										
											2024-07-15 06:09:02 -07:00
										 |  |  |             "IslandGenerationDistance": self.options.island_generation_distance.value, | 
					
						
							|  |  |  |             "ExpensiveResearch": bool(self.options.expensive_research), | 
					
						
							|  |  |  |             "DeathLink": bool(self.options.death_link) | 
					
						
							| 
									
										
										
										
											2022-07-05 19:37:08 -07:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | def create_region(world: MultiWorld, player: int, name: str, locations=None, exits=None): | 
					
						
							| 
									
										
										
										
											2023-02-13 18:06:43 -06:00
										 |  |  |     ret = Region(name, player, world) | 
					
						
							| 
									
										
										
										
											2022-01-21 13:41:53 -08:00
										 |  |  |     if locations: | 
					
						
							|  |  |  |         for location in locations: | 
					
						
							|  |  |  |             loc_id = locations_lookup_name_to_id.get(location, 0) | 
					
						
							|  |  |  |             locationObj = RaftLocation(player, location, loc_id, ret) | 
					
						
							|  |  |  |             ret.locations.append(locationObj) | 
					
						
							|  |  |  |     if exits: | 
					
						
							|  |  |  |         for exit in exits: | 
					
						
							|  |  |  |             ret.exits.append(Entrance(player, getConnectionName(name, exit), ret)) | 
					
						
							|  |  |  |     return ret | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class RaftLocation(Location): | 
					
						
							|  |  |  |     game = "Raft" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class RaftItem(Item): | 
					
						
							|  |  |  |     game = "Raft" |