| 
									
										
										
										
											2022-10-29 22:15:06 -05:00
										 |  |  | from typing import Dict, List, NamedTuple, Optional | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from BaseClasses import MultiWorld, Region, RegionType, Entrance | 
					
						
							|  |  |  | from .Items import RLItem | 
					
						
							|  |  |  | from .Locations import RLLocation, location_table, get_locations_by_category | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class RLRegionData(NamedTuple): | 
					
						
							|  |  |  |     locations: Optional[List[str]] | 
					
						
							|  |  |  |     exits: Optional[List[str]] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-01 16:14:09 -05:00
										 |  |  | def create_regions(multiworld: MultiWorld, player: int): | 
					
						
							| 
									
										
										
										
											2022-10-29 22:15:06 -05:00
										 |  |  |     regions: Dict[str, RLRegionData] = { | 
					
						
							|  |  |  |         "Menu": RLRegionData(None, ["Castle Hamson"]), | 
					
						
							|  |  |  |         "The Manor": RLRegionData([], []), | 
					
						
							|  |  |  |         "Castle Hamson": RLRegionData([], ["Forest Abkhazia", | 
					
						
							|  |  |  |                                            "The Maya", | 
					
						
							|  |  |  |                                            "Land of Darkness", | 
					
						
							|  |  |  |                                            "The Fountain Room", | 
					
						
							|  |  |  |                                            "The Manor"]), | 
					
						
							|  |  |  |         "Forest Abkhazia": RLRegionData([], []), | 
					
						
							|  |  |  |         "The Maya": RLRegionData([], []), | 
					
						
							|  |  |  |         "Land of Darkness": RLRegionData([], []), | 
					
						
							|  |  |  |         "The Fountain Room": RLRegionData([], None), | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Diaries | 
					
						
							|  |  |  |     for diary in range(0, 25): | 
					
						
							|  |  |  |         region: str | 
					
						
							|  |  |  |         if 0 <= diary < 6: | 
					
						
							|  |  |  |             region = "Castle Hamson" | 
					
						
							|  |  |  |         elif 6 <= diary < 12: | 
					
						
							|  |  |  |             region = "Forest Abkhazia" | 
					
						
							|  |  |  |         elif 12 <= diary < 18: | 
					
						
							|  |  |  |             region = "The Maya" | 
					
						
							|  |  |  |         elif 18 <= diary < 24: | 
					
						
							|  |  |  |             region = "Land of Darkness" | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             region = "The Fountain Room" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         regions[region].locations.append(f"Diary {diary + 1}") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Manor & Special | 
					
						
							|  |  |  |     for manor in get_locations_by_category("Manor").keys(): | 
					
						
							|  |  |  |         regions["The Manor"].locations.append(manor) | 
					
						
							|  |  |  |     for special in get_locations_by_category("Special").keys(): | 
					
						
							|  |  |  |         regions["Castle Hamson"].locations.append(special) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Boss Rewards | 
					
						
							|  |  |  |     regions["Castle Hamson"].locations.append("Castle Hamson Boss Reward") | 
					
						
							|  |  |  |     regions["Forest Abkhazia"].locations.append("Forest Abkhazia Boss Reward") | 
					
						
							|  |  |  |     regions["The Maya"].locations.append("The Maya Boss Reward") | 
					
						
							|  |  |  |     regions["Land of Darkness"].locations.append("Land of Darkness Boss Reward") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Events | 
					
						
							|  |  |  |     regions["Castle Hamson"].locations.append("Castle Hamson Boss Room") | 
					
						
							|  |  |  |     regions["Forest Abkhazia"].locations.append("Forest Abkhazia Boss Room") | 
					
						
							|  |  |  |     regions["The Maya"].locations.append("The Maya Boss Room") | 
					
						
							|  |  |  |     regions["Land of Darkness"].locations.append("Land of Darkness Boss Room") | 
					
						
							|  |  |  |     regions["The Fountain Room"].locations.append("Fountain Room") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Chests | 
					
						
							| 
									
										
										
										
											2022-11-01 16:14:09 -05:00
										 |  |  |     chests = int(multiworld.chests_per_zone[player]) | 
					
						
							| 
									
										
										
										
											2022-10-29 22:15:06 -05:00
										 |  |  |     for i in range(0, chests): | 
					
						
							| 
									
										
										
										
											2022-11-01 16:14:09 -05:00
										 |  |  |         if multiworld.universal_chests[player]: | 
					
						
							| 
									
										
										
										
											2022-10-29 22:15:06 -05:00
										 |  |  |             regions["Castle Hamson"].locations.append(f"Chest {i + 1}") | 
					
						
							|  |  |  |             regions["Forest Abkhazia"].locations.append(f"Chest {i + 1 + chests}") | 
					
						
							|  |  |  |             regions["The Maya"].locations.append(f"Chest {i + 1 + (chests * 2)}") | 
					
						
							|  |  |  |             regions["Land of Darkness"].locations.append(f"Chest {i + 1 + (chests * 3)}") | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             regions["Castle Hamson"].locations.append(f"Castle Hamson - Chest {i + 1}") | 
					
						
							|  |  |  |             regions["Forest Abkhazia"].locations.append(f"Forest Abkhazia - Chest {i + 1}") | 
					
						
							|  |  |  |             regions["The Maya"].locations.append(f"The Maya - Chest {i + 1}") | 
					
						
							|  |  |  |             regions["Land of Darkness"].locations.append(f"Land of Darkness - Chest {i + 1}") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Fairy Chests | 
					
						
							| 
									
										
										
										
											2022-11-01 16:14:09 -05:00
										 |  |  |     chests = int(multiworld.fairy_chests_per_zone[player]) | 
					
						
							| 
									
										
										
										
											2022-10-29 22:15:06 -05:00
										 |  |  |     for i in range(0, chests): | 
					
						
							| 
									
										
										
										
											2022-11-01 16:14:09 -05:00
										 |  |  |         if multiworld.universal_fairy_chests[player]: | 
					
						
							| 
									
										
										
										
											2022-10-29 22:15:06 -05:00
										 |  |  |             regions["Castle Hamson"].locations.append(f"Fairy Chest {i + 1}") | 
					
						
							|  |  |  |             regions["Forest Abkhazia"].locations.append(f"Fairy Chest {i + 1 + chests}") | 
					
						
							|  |  |  |             regions["The Maya"].locations.append(f"Fairy Chest {i + 1 + (chests * 2)}") | 
					
						
							|  |  |  |             regions["Land of Darkness"].locations.append(f"Fairy Chest {i + 1 + (chests * 3)}") | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             regions["Castle Hamson"].locations.append(f"Castle Hamson - Fairy Chest {i + 1}") | 
					
						
							|  |  |  |             regions["Forest Abkhazia"].locations.append(f"Forest Abkhazia - Fairy Chest {i + 1}") | 
					
						
							|  |  |  |             regions["The Maya"].locations.append(f"The Maya - Fairy Chest {i + 1}") | 
					
						
							|  |  |  |             regions["Land of Darkness"].locations.append(f"Land of Darkness - Fairy Chest {i + 1}") | 
					
						
							| 
									
										
										
										
											2022-01-03 18:12:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Set up the regions correctly. | 
					
						
							| 
									
										
										
										
											2022-10-29 22:15:06 -05:00
										 |  |  |     for name, data in regions.items(): | 
					
						
							| 
									
										
										
										
											2022-11-01 16:14:09 -05:00
										 |  |  |         multiworld.regions.append(create_region(multiworld, player, name, data.locations, data.exits)) | 
					
						
							| 
									
										
										
										
											2022-01-03 18:12:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-01 16:14:09 -05:00
										 |  |  |     multiworld.get_entrance("Castle Hamson", player).connect(multiworld.get_region("Castle Hamson", player)) | 
					
						
							|  |  |  |     multiworld.get_entrance("The Manor", player).connect(multiworld.get_region("The Manor", player)) | 
					
						
							|  |  |  |     multiworld.get_entrance("Forest Abkhazia", player).connect(multiworld.get_region("Forest Abkhazia", player)) | 
					
						
							|  |  |  |     multiworld.get_entrance("The Maya", player).connect(multiworld.get_region("The Maya", player)) | 
					
						
							|  |  |  |     multiworld.get_entrance("Land of Darkness", player).connect(multiworld.get_region("Land of Darkness", player)) | 
					
						
							|  |  |  |     multiworld.get_entrance("The Fountain Room", player).connect(multiworld.get_region("The Fountain Room", player)) | 
					
						
							| 
									
										
										
										
											2022-01-03 18:12:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-01 16:14:09 -05:00
										 |  |  | def create_region(multiworld: MultiWorld, player: int, name: str, locations=None, exits=None): | 
					
						
							| 
									
										
										
										
											2022-06-17 03:23:27 +02:00
										 |  |  |     ret = Region(name, RegionType.Generic, name, player) | 
					
						
							| 
									
										
										
										
											2022-11-01 16:14:09 -05:00
										 |  |  |     ret.multiworld = multiworld | 
					
						
							| 
									
										
										
										
											2022-01-03 18:12:32 +00:00
										 |  |  |     if locations: | 
					
						
							| 
									
										
										
										
											2022-10-29 22:15:06 -05:00
										 |  |  |         for loc_name in locations: | 
					
						
							|  |  |  |             loc_data = location_table.get(loc_name) | 
					
						
							|  |  |  |             location = RLLocation(player, loc_name, loc_data.code if loc_data else None, ret) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             # Special rule handling for fairy chests. | 
					
						
							|  |  |  |             if "Fairy" in loc_name: | 
					
						
							|  |  |  |                 location.access_rule = lambda state: state.has("Dragons", player) or ( | 
					
						
							|  |  |  |                         state.has("Enchantress", player) and ( | 
					
						
							|  |  |  |                         state.has("Vault Runes", player) or | 
					
						
							|  |  |  |                         state.has("Sprint Runes", player) or | 
					
						
							|  |  |  |                         state.has("Sky Runes", player))) | 
					
						
							| 
									
										
										
										
											2022-01-03 18:12:32 +00:00
										 |  |  |             ret.locations.append(location) | 
					
						
							|  |  |  |     if exits: | 
					
						
							|  |  |  |         for exit in exits: | 
					
						
							| 
									
										
										
										
											2022-10-29 22:15:06 -05:00
										 |  |  |             entrance = Entrance(player, exit, ret) | 
					
						
							|  |  |  |             ret.exits.append(entrance) | 
					
						
							| 
									
										
										
										
											2022-01-03 18:12:32 +00:00
										 |  |  |     return ret |