154 lines
6.6 KiB
Python
154 lines
6.6 KiB
Python
from typing import ClassVar, Dict, Any, Type
|
|
from BaseClasses import ItemClassification, Region, Location, Item, Tutorial
|
|
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
|
|
from .Options import ShortHikeOptions, shorthike_option_groups
|
|
|
|
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"]
|
|
)]
|
|
option_groups = shorthike_option_groups
|
|
|
|
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:
|
|
return self.options.filler_coin_amount.current_option_name
|
|
|
|
def create_item(self, name: str) -> "ShortHikeItem":
|
|
item_id: int = self.item_name_to_id[name]
|
|
id = item_id - base_id - 1
|
|
|
|
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)
|
|
|
|
def create_items(self) -> None:
|
|
itempool = []
|
|
for item in item_table:
|
|
count = item["count"]
|
|
|
|
if count <= 0:
|
|
continue
|
|
else:
|
|
for i in range(count):
|
|
itempool.append(self.create_item(item["name"]))
|
|
|
|
feather_count = self.options.golden_feathers
|
|
if self.options.goal == 1 or self.options.goal == 3:
|
|
if feather_count < 12:
|
|
feather_count = 12
|
|
|
|
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
|
|
|
|
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
|
|
self.multiworld.completion_condition[self.player] = lambda state: state.can_reach_location("Hawk Peak Race Reward", self.player)
|
|
elif self.options.goal == "help_everyone":
|
|
# Help Everyone
|
|
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))
|
|
elif self.options.goal == "fishmonger":
|
|
# Fishmonger
|
|
self.multiworld.completion_condition[self.player] = lambda state: state.can_reach_location("Catch All Fish Reward", self.player)
|
|
|
|
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),
|
|
"shopCheckLogic": int(options.shop_check_logic),
|
|
"minShopCheckLogic": int(options.min_shop_check_logic),
|
|
"easierRaces": bool(options.easier_races),
|
|
}
|
|
|
|
slot_data = {
|
|
"settings": settings,
|
|
}
|
|
|
|
return slot_data
|
|
|
|
class ShortHikeItem(Item):
|
|
game: str = "A Short Hike"
|
|
|
|
class ShortHikeLocation(Location):
|
|
game: str = "A Short Hike"
|