| 
									
										
										
										
											2024-03-20 22:44:09 +01:00
										 |  |  | from typing import ClassVar, Dict, Any, Type | 
					
						
							| 
									
										
										
										
											2024-06-05 17:50:30 -05:00
										 |  |  | from BaseClasses import ItemClassification, Region, Location, Item, Tutorial | 
					
						
							| 
									
										
										
										
											2024-03-20 22:44:09 +01:00
										 |  |  | from Options import PerGameCommonOptions | 
					
						
							|  |  |  | from worlds.AutoWorld import World, WebWorld | 
					
						
							|  |  |  | from .Items import item_table, group_table, base_id | 
					
						
							|  |  |  | from .Locations import location_table | 
					
						
							|  |  |  | from .Rules import create_rules, get_min_feathers | 
					
						
							| 
									
										
										
										
											2024-06-05 17:50:30 -05:00
										 |  |  | from .Options import ShortHikeOptions, shorthike_option_groups | 
					
						
							| 
									
										
										
										
											2024-03-20 22:44:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | class ShortHikeWeb(WebWorld): | 
					
						
							|  |  |  |     theme = "ocean" | 
					
						
							|  |  |  |     tutorials = [Tutorial( | 
					
						
							|  |  |  |         "Multiworld Setup Guide", | 
					
						
							|  |  |  |         "A guide to setting up the A Short Hike randomizer connected to an Archipelago Multiworld", | 
					
						
							|  |  |  |         "English", | 
					
						
							|  |  |  |         "setup_en.md", | 
					
						
							|  |  |  |         "setup/en", | 
					
						
							|  |  |  |         ["Chandler"] | 
					
						
							|  |  |  |     )] | 
					
						
							| 
									
										
										
										
											2024-06-05 17:50:30 -05:00
										 |  |  |     option_groups = shorthike_option_groups | 
					
						
							| 
									
										
										
										
											2024-03-20 22:44:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | class ShortHikeWorld(World): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     A Short Hike is a relaxing adventure set on the islands of Hawk Peak. Fly and climb using Claire's wings and Golden Feathers | 
					
						
							|  |  |  |     to make your way up to the summit. Along the way you'll meet other hikers, discover hidden treasures, | 
					
						
							|  |  |  |     and take in the beautiful world around you. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     game = "A Short Hike" | 
					
						
							|  |  |  |     web = ShortHikeWeb() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     item_name_to_id = {item["name"]: item["id"] for item in item_table} | 
					
						
							|  |  |  |     location_name_to_id = {loc["name"]: loc["id"] for loc in location_table} | 
					
						
							|  |  |  |     location_name_to_game_id = {loc["name"]: loc["inGameId"] for loc in location_table} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     item_name_groups = group_table | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     options_dataclass: ClassVar[Type[PerGameCommonOptions]] = ShortHikeOptions | 
					
						
							|  |  |  |     options: ShortHikeOptions | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     required_client_version = (0, 4, 4) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get_filler_item_name(self) -> str: | 
					
						
							| 
									
										
										
										
											2024-03-22 15:30:23 -05:00
										 |  |  |         return self.options.filler_coin_amount.current_option_name | 
					
						
							| 
									
										
										
										
											2024-03-20 22:44:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def create_item(self, name: str) -> "ShortHikeItem": | 
					
						
							|  |  |  |         item_id: int = self.item_name_to_id[name] | 
					
						
							|  |  |  |         id = item_id - base_id - 1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-05 17:50:30 -05:00
										 |  |  |         classification = item_table[id]["classification"] | 
					
						
							|  |  |  |         if self.options.easier_races and name == "Running Shoes": | 
					
						
							|  |  |  |             classification = ItemClassification.progression | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return ShortHikeItem(name, classification, item_id, player=self.player) | 
					
						
							| 
									
										
										
										
											2024-03-20 22:44:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def create_items(self) -> None: | 
					
						
							| 
									
										
										
										
											2024-06-05 17:50:30 -05:00
										 |  |  |         itempool = [] | 
					
						
							| 
									
										
										
										
											2024-03-20 22:44:09 +01:00
										 |  |  |         for item in item_table: | 
					
						
							|  |  |  |             count = item["count"] | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |             if count <= 0: | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 for i in range(count): | 
					
						
							| 
									
										
										
										
											2024-06-05 17:50:30 -05:00
										 |  |  |                     itempool.append(self.create_item(item["name"])) | 
					
						
							| 
									
										
										
										
											2024-03-20 22:44:09 +01:00
										 |  |  |   | 
					
						
							|  |  |  |         feather_count = self.options.golden_feathers | 
					
						
							|  |  |  |         if self.options.goal == 1 or self.options.goal == 3: | 
					
						
							|  |  |  |             if feather_count < 12: | 
					
						
							|  |  |  |                 feather_count = 12 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-05 17:50:30 -05:00
										 |  |  |         itempool += [self.create_item("Golden Feather") for _ in range(feather_count)] | 
					
						
							|  |  |  |         itempool += [self.create_item("Silver Feather") for _ in range(self.options.silver_feathers)] | 
					
						
							|  |  |  |         itempool += [self.create_item("Bucket") for _ in range(self.options.buckets)] | 
					
						
							|  |  |  |         itempool += [self.create_item("Stick") for _ in range(self.options.sticks)] | 
					
						
							|  |  |  |         itempool += [self.create_item("Toy Shovel") for _ in range(self.options.toy_shovels)] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if self.options.random_walkie_talkie: | 
					
						
							|  |  |  |             itempool.append(self.create_item("Walkie Talkie")) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             self.multiworld.get_location("Lose Race Gift", self.player).place_locked_item(self.create_item("Walkie Talkie")) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         junk = len(self.multiworld.get_unfilled_locations(self.player)) - len(itempool) | 
					
						
							|  |  |  |         itempool += [self.create_item(self.get_filler_item_name()) for _ in range(junk)] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.multiworld.itempool += itempool | 
					
						
							| 
									
										
										
										
											2024-03-20 22:44:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def create_regions(self) -> None: | 
					
						
							|  |  |  |         menu_region = Region("Menu", self.player, self.multiworld) | 
					
						
							|  |  |  |         self.multiworld.regions.append(menu_region) | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         main_region = Region("Hawk Peak", self.player, self.multiworld) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for loc in self.location_name_to_id.keys(): | 
					
						
							|  |  |  |             main_region.locations.append(ShortHikeLocation(self.player, loc, self.location_name_to_id[loc], main_region)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.multiworld.regions.append(main_region) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         menu_region.connect(main_region) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if self.options.goal == "nap": | 
					
						
							|  |  |  |             # Nap | 
					
						
							|  |  |  |             self.multiworld.completion_condition[self.player] = lambda state: (state.has("Golden Feather", self.player, get_min_feathers(self, 7, 9)) | 
					
						
							|  |  |  |                 or (state.has("Bucket", self.player) and state.has("Golden Feather", self.player, 7))) | 
					
						
							|  |  |  |         elif self.options.goal == "photo": | 
					
						
							|  |  |  |             # Photo | 
					
						
							|  |  |  |             self.multiworld.completion_condition[self.player] = lambda state: state.has("Golden Feather", self.player, 12) | 
					
						
							|  |  |  |         elif self.options.goal == "races": | 
					
						
							|  |  |  |             # Races | 
					
						
							| 
									
										
										
										
											2024-06-05 17:50:30 -05:00
										 |  |  |             self.multiworld.completion_condition[self.player] = lambda state: state.can_reach_location("Hawk Peak Race Reward", self.player) | 
					
						
							| 
									
										
										
										
											2024-03-20 22:44:09 +01:00
										 |  |  |         elif self.options.goal == "help_everyone": | 
					
						
							|  |  |  |             # Help Everyone | 
					
						
							| 
									
										
										
										
											2024-06-05 17:50:30 -05:00
										 |  |  |             self.multiworld.completion_condition[self.player] = lambda state: (state.can_reach_location("Collect 15 Seashells", self.player) | 
					
						
							|  |  |  |                 and state.has("Golden Feather", self.player, 12) | 
					
						
							|  |  |  |                 and state.can_reach_location("Tough Bird Salesman (400 Coins)", self.player) | 
					
						
							|  |  |  |                 and state.can_reach_location("Ranger May Shell Necklace Golden Feather", self.player) | 
					
						
							|  |  |  |                 and state.can_reach_location("Sue the Rabbit Shoes Reward", self.player) | 
					
						
							|  |  |  |                 and state.can_reach_location("Wristwatch Trade", self.player) | 
					
						
							|  |  |  |                 and state.can_reach_location("Return Camping Permit", self.player) | 
					
						
							|  |  |  |                 and state.can_reach_location("Boat Challenge Reward", self.player) | 
					
						
							|  |  |  |                 and state.can_reach_location("Shovel Kid Trade", self.player) | 
					
						
							|  |  |  |                 and state.can_reach_location("Purchase Sunhat", self.player) | 
					
						
							|  |  |  |                 and state.can_reach_location("Artist Golden Feather", self.player)) | 
					
						
							| 
									
										
										
										
											2024-03-20 22:44:09 +01:00
										 |  |  |         elif self.options.goal == "fishmonger": | 
					
						
							|  |  |  |             # Fishmonger | 
					
						
							| 
									
										
										
										
											2024-06-05 17:50:30 -05:00
										 |  |  |             self.multiworld.completion_condition[self.player] = lambda state: state.can_reach_location("Catch All Fish Reward", self.player) | 
					
						
							| 
									
										
										
										
											2024-03-20 22:44:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def set_rules(self): | 
					
						
							|  |  |  |         create_rules(self, location_table) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def fill_slot_data(self) -> Dict[str, Any]: | 
					
						
							|  |  |  |         options = self.options | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         settings = { | 
					
						
							|  |  |  |             "goal": int(options.goal), | 
					
						
							|  |  |  |             "logicLevel": int(options.golden_feather_progression), | 
					
						
							|  |  |  |             "costMultiplier": int(options.cost_multiplier), | 
					
						
							| 
									
										
										
										
											2024-06-05 17:50:30 -05:00
										 |  |  |             "shopCheckLogic": int(options.shop_check_logic), | 
					
						
							|  |  |  |             "minShopCheckLogic": int(options.min_shop_check_logic), | 
					
						
							|  |  |  |             "easierRaces": bool(options.easier_races), | 
					
						
							| 
									
										
										
										
											2024-03-20 22:44:09 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |         slot_data = { | 
					
						
							|  |  |  |             "settings": settings, | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |         return slot_data | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ShortHikeItem(Item): | 
					
						
							|  |  |  |     game: str = "A Short Hike" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ShortHikeLocation(Location): | 
					
						
							|  |  |  |     game: str = "A Short Hike" |