From c554c3fdaee6c30898ff2555d856deac7b734dc6 Mon Sep 17 00:00:00 2001 From: chandler05 <66492208+chandler05@users.noreply.github.com> Date: Wed, 5 Jun 2024 17:50:30 -0500 Subject: [PATCH] A Short Hike: Add new options and option groups (#3410) * A Short Hike: New options and stuff * Add to slot data for poptracker * Address concerns * Address concerns * Fix indentations * Update option description * Address all issues * Group "or"s --- worlds/shorthike/Items.py | 14 +- worlds/shorthike/Locations.py | 264 +++++++++++++++++----------------- worlds/shorthike/Options.py | 87 ++++++++++- worlds/shorthike/Rules.py | 44 +++++- worlds/shorthike/__init__.py | 61 +++++--- 5 files changed, 302 insertions(+), 168 deletions(-) diff --git a/worlds/shorthike/Items.py b/worlds/shorthike/Items.py index a240dcbc6a1f..7a5a81db9be6 100644 --- a/worlds/shorthike/Items.py +++ b/worlds/shorthike/Items.py @@ -10,15 +10,15 @@ class ItemDict(TypedDict): base_id = 82000 item_table: List[ItemDict] = [ - {"name": "Stick", "id": base_id + 1, "count": 8, "classification": ItemClassification.progression_skip_balancing}, + {"name": "Stick", "id": base_id + 1, "count": 0, "classification": ItemClassification.progression_skip_balancing}, {"name": "Seashell", "id": base_id + 2, "count": 23, "classification": ItemClassification.progression_skip_balancing}, {"name": "Golden Feather", "id": base_id + 3, "count": 0, "classification": ItemClassification.progression}, {"name": "Silver Feather", "id": base_id + 4, "count": 0, "classification": ItemClassification.useful}, {"name": "Bucket", "id": base_id + 5, "count": 0, "classification": ItemClassification.progression}, {"name": "Bait", "id": base_id + 6, "count": 2, "classification": ItemClassification.filler}, - {"name": "Fishing Rod", "id": base_id + 7, "count": 2, "classification": ItemClassification.progression}, + {"name": "Progressive Fishing Rod", "id": base_id + 7, "count": 2, "classification": ItemClassification.progression}, {"name": "Shovel", "id": base_id + 8, "count": 1, "classification": ItemClassification.progression}, - {"name": "Toy Shovel", "id": base_id + 9, "count": 5, "classification": ItemClassification.progression_skip_balancing}, + {"name": "Toy Shovel", "id": base_id + 9, "count": 0, "classification": ItemClassification.progression_skip_balancing}, {"name": "Compass", "id": base_id + 10, "count": 1, "classification": ItemClassification.useful}, {"name": "Medal", "id": base_id + 11, "count": 3, "classification": ItemClassification.filler}, {"name": "Shell Necklace", "id": base_id + 12, "count": 1, "classification": ItemClassification.progression}, @@ -36,7 +36,7 @@ class ItemDict(TypedDict): {"name": "Headband", "id": base_id + 24, "count": 1, "classification": ItemClassification.progression}, {"name": "Running Shoes", "id": base_id + 25, "count": 1, "classification": ItemClassification.useful}, {"name": "Camping Permit", "id": base_id + 26, "count": 1, "classification": ItemClassification.progression}, - {"name": "Walkie Talkie", "id": base_id + 27, "count": 1, "classification": ItemClassification.useful}, + {"name": "Walkie Talkie", "id": base_id + 27, "count": 0, "classification": ItemClassification.useful}, # Not in the item pool for now #{"name": "Boating Manual", "id": base_id + ~, "count": 1, "classification": ItemClassification.filler}, @@ -48,9 +48,9 @@ class ItemDict(TypedDict): {"name": "21 Coins", "id": base_id + 31, "count": 2, "classification": ItemClassification.filler}, {"name": "25 Coins", "id": base_id + 32, "count": 7, "classification": ItemClassification.filler}, {"name": "27 Coins", "id": base_id + 33, "count": 1, "classification": ItemClassification.filler}, - {"name": "32 Coins", "id": base_id + 34, "count": 1, "classification": ItemClassification.filler}, - {"name": "33 Coins", "id": base_id + 35, "count": 6, "classification": ItemClassification.filler}, - {"name": "50 Coins", "id": base_id + 36, "count": 1, "classification": ItemClassification.filler}, + {"name": "32 Coins", "id": base_id + 34, "count": 1, "classification": ItemClassification.useful}, + {"name": "33 Coins", "id": base_id + 35, "count": 6, "classification": ItemClassification.useful}, + {"name": "50 Coins", "id": base_id + 36, "count": 1, "classification": ItemClassification.useful}, # Filler item determined by settings {"name": "13 Coins", "id": base_id + 37, "count": 0, "classification": ItemClassification.filler}, diff --git a/worlds/shorthike/Locations.py b/worlds/shorthike/Locations.py index c2d316c68675..319ad8f20e1b 100644 --- a/worlds/shorthike/Locations.py +++ b/worlds/shorthike/Locations.py @@ -5,7 +5,7 @@ class LocationInfo(TypedDict): id: int inGameId: str needsShovel: bool - purchase: bool + purchase: int minGoldenFeathers: int minGoldenFeathersEasy: int minGoldenFeathersBucket: int @@ -17,311 +17,311 @@ class LocationInfo(TypedDict): {"name": "Start Beach Seashell", "id": base_id + 1, "inGameId": "PickUps.3", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Beach Hut Seashell", "id": base_id + 2, "inGameId": "PickUps.2", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Beach Umbrella Seashell", "id": base_id + 3, "inGameId": "PickUps.8", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Sid Beach Mound Seashell", "id": base_id + 4, "inGameId": "PickUps.12", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Sid Beach Seashell", "id": base_id + 5, "inGameId": "PickUps.11", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Shirley's Point Beach Seashell", "id": base_id + 6, "inGameId": "PickUps.18", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Shirley's Point Rock Seashell", "id": base_id + 7, "inGameId": "PickUps.17", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Visitor's Center Beach Seashell", "id": base_id + 8, "inGameId": "PickUps.19", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "West River Seashell", "id": base_id + 9, "inGameId": "PickUps.10", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "West Riverbank Seashell", "id": base_id + 10, "inGameId": "PickUps.4", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Stone Tower Riverbank Seashell", "id": base_id + 11, "inGameId": "PickUps.23", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "North Beach Seashell", "id": base_id + 12, "inGameId": "PickUps.6", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "North Coast Seashell", "id": base_id + 13, "inGameId": "PickUps.7", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Boat Cliff Seashell", "id": base_id + 14, "inGameId": "PickUps.14", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Boat Isle Mound Seashell", "id": base_id + 15, "inGameId": "PickUps.22", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "East Coast Seashell", "id": base_id + 16, "inGameId": "PickUps.21", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "House North Beach Seashell", "id": base_id + 17, "inGameId": "PickUps.16", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Airstream Island North Seashell", "id": base_id + 18, "inGameId": "PickUps.13", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Airstream Island South Seashell", "id": base_id + 19, "inGameId": "PickUps.15", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Secret Island Beach Seashell", "id": base_id + 20, "inGameId": "PickUps.1", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Meteor Lake Seashell", "id": base_id + 126, "inGameId": "PickUps.20", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Good Creek Path Seashell", "id": base_id + 127, "inGameId": "PickUps.9", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, # Visitor's Center Shop {"name": "Visitor's Center Shop Golden Feather 1", "id": base_id + 21, "inGameId": "CampRangerNPC[0]", - "needsShovel": False, "purchase": True, + "needsShovel": False, "purchase": 40, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Visitor's Center Shop Golden Feather 2", "id": base_id + 22, "inGameId": "CampRangerNPC[1]", - "needsShovel": False, "purchase": True, + "needsShovel": False, "purchase": 40, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Visitor's Center Shop Hat", "id": base_id + 23, "inGameId": "CampRangerNPC[9]", - "needsShovel": False, "purchase": True, + "needsShovel": False, "purchase": 100, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, # Tough Bird Salesman {"name": "Tough Bird Salesman Golden Feather 1", "id": base_id + 24, "inGameId": "ToughBirdNPC (1)[0]", - "needsShovel": False, "purchase": True, + "needsShovel": False, "purchase": 100, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Tough Bird Salesman Golden Feather 2", "id": base_id + 25, "inGameId": "ToughBirdNPC (1)[1]", - "needsShovel": False, "purchase": True, + "needsShovel": False, "purchase": 100, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Tough Bird Salesman Golden Feather 3", "id": base_id + 26, "inGameId": "ToughBirdNPC (1)[2]", - "needsShovel": False, "purchase": True, + "needsShovel": False, "purchase": 100, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Tough Bird Salesman Golden Feather 4", "id": base_id + 27, "inGameId": "ToughBirdNPC (1)[3]", - "needsShovel": False, "purchase": True, + "needsShovel": False, "purchase": 100, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Tough Bird Salesman (400 Coins)", "id": base_id + 28, "inGameId": "ToughBirdNPC (1)[9]", - "needsShovel": False, "purchase": True, + "needsShovel": False, "purchase": 400, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, # Beachstickball {"name": "Beachstickball (10 Hits)", "id": base_id + 29, "inGameId": "VolleyballOpponent[0]", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Beachstickball (20 Hits)", "id": base_id + 30, "inGameId": "VolleyballOpponent[1]", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Beachstickball (30 Hits)", "id": base_id + 31, "inGameId": "VolleyballOpponent[2]", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, # Misc Item Locations {"name": "Shovel Kid Trade", "id": base_id + 32, "inGameId": "Frog_StandingNPC[0]", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Compass Guy", "id": base_id + 33, "inGameId": "Fox_WalkingNPC[0]", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Hawk Peak Bucket Rock", "id": base_id + 34, "inGameId": "Tools.23", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Orange Islands Bucket Rock", "id": base_id + 35, "inGameId": "Tools.42", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Bill the Walrus Fisherman", "id": base_id + 36, "inGameId": "SittingNPC (1)[0]", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Catch 3 Fish Reward", "id": base_id + 37, "inGameId": "FishBuyer[0]", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Catch All Fish Reward", "id": base_id + 38, "inGameId": "FishBuyer[1]", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 7, "minGoldenFeathersEasy": 9, "minGoldenFeathersBucket": 7}, {"name": "Permit Guy Bribe", "id": base_id + 39, "inGameId": "CamperNPC[0]", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Catch Fish with Permit", "id": base_id + 129, "inGameId": "Player[0]", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Return Camping Permit", "id": base_id + 130, "inGameId": "CamperNPC[1]", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, # Original Pickaxe Locations {"name": "Blocked Mine Pickaxe 1", "id": base_id + 40, "inGameId": "Tools.31", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Blocked Mine Pickaxe 2", "id": base_id + 41, "inGameId": "Tools.32", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Blocked Mine Pickaxe 3", "id": base_id + 42, "inGameId": "Tools.33", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, # Original Toy Shovel Locations {"name": "Blackwood Trail Lookout Toy Shovel", "id": base_id + 43, "inGameId": "PickUps.27", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Shirley's Point Beach Toy Shovel", "id": base_id + 44, "inGameId": "PickUps.30", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Visitor's Center Beach Toy Shovel", "id": base_id + 45, "inGameId": "PickUps.29", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Blackwood Trail Rock Toy Shovel", "id": base_id + 46, "inGameId": "PickUps.26", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Beach Hut Cliff Toy Shovel", "id": base_id + 128, "inGameId": "PickUps.28", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, # Original Stick Locations {"name": "Secret Island Beach Trail Stick", "id": base_id + 47, "inGameId": "PickUps.25", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Below Lighthouse Walkway Stick", "id": base_id + 48, "inGameId": "Tools.3", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Beach Hut Rocky Pool Sand Stick", "id": base_id + 49, "inGameId": "Tools.0", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Cliff Overlooking West River Waterfall Stick", "id": base_id + 50, "inGameId": "Tools.2", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 2, "minGoldenFeathersBucket": 0}, {"name": "Trail to Tough Bird Salesman Stick", "id": base_id + 51, "inGameId": "Tools.8", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "North Beach Stick", "id": base_id + 52, "inGameId": "Tools.4", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Beachstickball Court Stick", "id": base_id + 53, "inGameId": "VolleyballMinigame.4", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Stick Under Sid Beach Umbrella", "id": base_id + 54, "inGameId": "Tools.1", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, # Boating @@ -333,377 +333,377 @@ class LocationInfo(TypedDict): {"name": "Boat Challenge Reward", "id": base_id + 56, "inGameId": "DeerKidBoat[0]", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, # Not a location for now, corresponding with the Boating Manual # {"name": "Receive Boating Manual", # "id": base_id + 133, # "inGameId": "DadDeer[1]", - # "needsShovel": False, "purchase": False, + # "needsShovel": False, "purchase": 0, # "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, # Original Map Locations {"name": "Outlook Point Dog Gift", "id": base_id + 57, "inGameId": "Dog_WalkingNPC_BlueEyed[0]", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, # Original Clothes Locations {"name": "Collect 15 Seashells", "id": base_id + 58, "inGameId": "LittleKidNPCVariant (1)[0]", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Return to Shell Kid", "id": base_id + 132, "inGameId": "LittleKidNPCVariant (1)[1]", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Taylor the Turtle Headband Gift", "id": base_id + 59, "inGameId": "Turtle_WalkingNPC[0]", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Sue the Rabbit Shoes Reward", "id": base_id + 60, "inGameId": "Bunny_WalkingNPC (1)[0]", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Purchase Sunhat", "id": base_id + 61, "inGameId": "SittingNPC[0]", - "needsShovel": False, "purchase": True, + "needsShovel": False, "purchase": 100, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, # Original Golden Feather Locations {"name": "Blackwood Forest Golden Feather", "id": base_id + 62, "inGameId": "Feathers.3", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Ranger May Shell Necklace Golden Feather", "id": base_id + 63, "inGameId": "AuntMayNPC[0]", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Sand Castle Golden Feather", "id": base_id + 64, "inGameId": "SandProvince.3", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Artist Golden Feather", "id": base_id + 65, "inGameId": "StandingNPC[0]", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Visitor Camp Rock Golden Feather", "id": base_id + 66, "inGameId": "Feathers.8", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Outlook Cliff Golden Feather", "id": base_id + 67, "inGameId": "Feathers.2", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Meteor Lake Cliff Golden Feather", "id": base_id + 68, "inGameId": "Feathers.7", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 5, "minGoldenFeathersBucket": 0}, # Original Silver Feather Locations {"name": "Secret Island Peak", "id": base_id + 69, "inGameId": "PickUps.24", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 5, "minGoldenFeathersEasy": 7, "minGoldenFeathersBucket": 7}, {"name": "Wristwatch Trade", "id": base_id + 70, "inGameId": "Goat_StandingNPC[0]", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, # Golden Chests {"name": "Lighthouse Golden Chest", "id": base_id + 71, "inGameId": "Feathers.0", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 2, "minGoldenFeathersEasy": 3, "minGoldenFeathersBucket": 0}, {"name": "Outlook Golden Chest", "id": base_id + 72, "inGameId": "Feathers.6", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Stone Tower Golden Chest", "id": base_id + 73, "inGameId": "Feathers.5", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "North Cliff Golden Chest", "id": base_id + 74, "inGameId": "Feathers.4", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 3, "minGoldenFeathersEasy": 10, "minGoldenFeathersBucket": 10}, # Chests {"name": "Blackwood Cliff Chest", "id": base_id + 75, "inGameId": "Coins.22", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "White Coast Trail Chest", "id": base_id + 76, "inGameId": "Coins.6", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Sid Beach Chest", "id": base_id + 77, "inGameId": "Coins.7", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Sid Beach Buried Treasure Chest", "id": base_id + 78, "inGameId": "Coins.46", - "needsShovel": True, "purchase": False, + "needsShovel": True, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Sid Beach Cliff Chest", "id": base_id + 79, "inGameId": "Coins.9", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Visitor's Center Buried Chest", "id": base_id + 80, "inGameId": "Coins.94", - "needsShovel": True, "purchase": False, + "needsShovel": True, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Visitor's Center Hidden Chest", "id": base_id + 81, "inGameId": "Coins.42", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Shirley's Point Chest", "id": base_id + 82, "inGameId": "Coins.10", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 1, "minGoldenFeathersEasy": 2, "minGoldenFeathersBucket": 2}, {"name": "Caravan Cliff Chest", "id": base_id + 83, "inGameId": "Coins.12", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Caravan Arch Chest", "id": base_id + 84, "inGameId": "Coins.11", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "King Buried Treasure Chest", "id": base_id + 85, "inGameId": "Coins.41", - "needsShovel": True, "purchase": False, + "needsShovel": True, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Good Creek Path Buried Chest", "id": base_id + 86, "inGameId": "Coins.48", - "needsShovel": True, "purchase": False, + "needsShovel": True, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Good Creek Path West Chest", "id": base_id + 87, "inGameId": "Coins.33", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Good Creek Path East Chest", "id": base_id + 88, "inGameId": "Coins.62", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "West Waterfall Chest", "id": base_id + 89, "inGameId": "Coins.20", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Stone Tower West Cliff Chest", "id": base_id + 90, "inGameId": "PickUps.0", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Bucket Path Chest", "id": base_id + 91, "inGameId": "Coins.50", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Bucket Cliff Chest", "id": base_id + 92, "inGameId": "Coins.49", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 3, "minGoldenFeathersEasy": 5, "minGoldenFeathersBucket": 5}, {"name": "In Her Shadow Buried Treasure Chest", "id": base_id + 93, "inGameId": "Feathers.9", - "needsShovel": True, "purchase": False, + "needsShovel": True, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Meteor Lake Buried Chest", "id": base_id + 94, "inGameId": "Coins.86", - "needsShovel": True, "purchase": False, + "needsShovel": True, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Meteor Lake Chest", "id": base_id + 95, "inGameId": "Coins.64", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "House North Beach Chest", "id": base_id + 96, "inGameId": "Coins.65", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "East Coast Chest", "id": base_id + 97, "inGameId": "Coins.98", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Fisherman's Boat Chest 1", "id": base_id + 99, "inGameId": "Boat.0", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Fisherman's Boat Chest 2", "id": base_id + 100, "inGameId": "Boat.7", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Airstream Island Chest", "id": base_id + 101, "inGameId": "Coins.31", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "West River Waterfall Head Chest", "id": base_id + 102, "inGameId": "Coins.34", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Old Building Chest", "id": base_id + 103, "inGameId": "Coins.104", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Old Building West Chest", "id": base_id + 104, "inGameId": "Coins.109", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Old Building East Chest", "id": base_id + 105, "inGameId": "Coins.8", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Hawk Peak West Chest", "id": base_id + 106, "inGameId": "Coins.21", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 3, "minGoldenFeathersEasy": 5, "minGoldenFeathersBucket": 5}, {"name": "Hawk Peak East Buried Chest", "id": base_id + 107, "inGameId": "Coins.76", - "needsShovel": True, "purchase": False, + "needsShovel": True, "purchase": 0, "minGoldenFeathers": 3, "minGoldenFeathersEasy": 5, "minGoldenFeathersBucket": 5}, {"name": "Hawk Peak Northeast Chest", "id": base_id + 108, "inGameId": "Coins.79", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 3, "minGoldenFeathersEasy": 5, "minGoldenFeathersBucket": 5}, {"name": "Northern East Coast Chest", "id": base_id + 109, "inGameId": "Coins.45", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 2, "minGoldenFeathersBucket": 0}, {"name": "North Coast Chest", "id": base_id + 110, "inGameId": "Coins.28", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "North Coast Buried Chest", "id": base_id + 111, "inGameId": "Coins.47", - "needsShovel": True, "purchase": False, + "needsShovel": True, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Small South Island Buried Chest", "id": base_id + 112, "inGameId": "Coins.87", - "needsShovel": True, "purchase": False, + "needsShovel": True, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Secret Island Bottom Chest", "id": base_id + 113, "inGameId": "Coins.88", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Secret Island Treehouse Chest", "id": base_id + 114, "inGameId": "Coins.89", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 1, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 1}, {"name": "Sunhat Island Buried Chest", "id": base_id + 115, "inGameId": "Coins.112", - "needsShovel": True, "purchase": False, + "needsShovel": True, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Orange Islands South Buried Chest", "id": base_id + 116, "inGameId": "Coins.119", - "needsShovel": True, "purchase": False, + "needsShovel": True, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Orange Islands West Chest", "id": base_id + 117, "inGameId": "Coins.121", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Orange Islands North Buried Chest", "id": base_id + 118, "inGameId": "Coins.117", - "needsShovel": True, "purchase": False, + "needsShovel": True, "purchase": 0, "minGoldenFeathers": 1, "minGoldenFeathersEasy": 1, "minGoldenFeathersBucket": 0}, {"name": "Orange Islands East Chest", "id": base_id + 119, "inGameId": "Coins.120", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Orange Islands South Hidden Chest", "id": base_id + 120, "inGameId": "Coins.124", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "A Stormy View Buried Treasure Chest", "id": base_id + 121, "inGameId": "Coins.113", - "needsShovel": True, "purchase": False, + "needsShovel": True, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, {"name": "Orange Islands Ruins Buried Chest", "id": base_id + 122, "inGameId": "Coins.118", - "needsShovel": True, "purchase": False, + "needsShovel": True, "purchase": 0, "minGoldenFeathers": 2, "minGoldenFeathersEasy": 4, "minGoldenFeathersBucket": 0}, # Race Rewards {"name": "Lighthouse Race Reward", "id": base_id + 123, "inGameId": "RaceOpponent[0]", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 2, "minGoldenFeathersEasy": 3, "minGoldenFeathersBucket": 1}, {"name": "Old Building Race Reward", "id": base_id + 124, "inGameId": "RaceOpponent[1]", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 1, "minGoldenFeathersEasy": 5, "minGoldenFeathersBucket": 0}, {"name": "Hawk Peak Race Reward", "id": base_id + 125, "inGameId": "RaceOpponent[2]", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 7, "minGoldenFeathersEasy": 9, "minGoldenFeathersBucket": 7}, {"name": "Lose Race Gift", "id": base_id + 131, "inGameId": "RaceOpponent[9]", - "needsShovel": False, "purchase": False, + "needsShovel": False, "purchase": 0, "minGoldenFeathers": 0, "minGoldenFeathersEasy": 0, "minGoldenFeathersBucket": 0}, ] diff --git a/worlds/shorthike/Options.py b/worlds/shorthike/Options.py index 1ac0ff52f974..3d9bf81a3cf8 100644 --- a/worlds/shorthike/Options.py +++ b/worlds/shorthike/Options.py @@ -1,5 +1,5 @@ from dataclasses import dataclass -from Options import Choice, PerGameCommonOptions, Range, StartInventoryPool, Toggle +from Options import Choice, OptionGroup, PerGameCommonOptions, Range, StartInventoryPool, Toggle, DefaultOnToggle class Goal(Choice): """Choose the end goal. @@ -22,8 +22,10 @@ class CoinsInShops(Toggle): default = False class GoldenFeathers(Range): - """Number of Golden Feathers in the item pool. - (Note that for the Photo and Help Everyone goals, a minimum of 12 Golden Feathers is enforced)""" + """ + Number of Golden Feathers in the item pool. + (Note that for the Photo and Help Everyone goals, a minimum of 12 Golden Feathers is enforced) + """ display_name = "Golden Feathers" range_start = 0 range_end = 20 @@ -43,6 +45,20 @@ class Buckets(Range): range_end = 2 default = 2 +class Sticks(Range): + """Number of Sticks in the item pool.""" + display_name = "Sticks" + range_start = 1 + range_end = 8 + default = 8 + +class ToyShovels(Range): + """Number of Toy Shovels in the item pool.""" + display_name = "Toy Shovels" + range_start = 1 + range_end = 5 + default = 5 + class GoldenFeatherProgression(Choice): """Determines which locations are considered in logic based on the required amount of golden feathers to reach them. Easy: Locations will be considered inaccessible until the player has enough golden feathers to easily reach them. A minimum of 10 golden feathers is recommended for this setting. @@ -76,6 +92,40 @@ class FillerCoinAmount(Choice): option_50_coins = 9 default = 1 +class RandomWalkieTalkie(DefaultOnToggle): + """ + When enabled, the Walkie Talkie item will be placed into the item pool. Otherwise, it will be placed in its vanilla location. + This item usually allows the player to locate Avery around the map or restart a race. + """ + display_name = "Randomize Walkie Talkie" + +class EasierRaces(Toggle): + """When enabled, the Running Shoes will be added as a logical requirement for beating any of the races.""" + display_name = "Easier Races" + +class ShopCheckLogic(Choice): + """Determines which items will be added as logical requirements to making certain purchases in shops.""" + display_name = "Shop Check Logic" + option_nothing = 0 + option_fishing_rod = 1 + option_shovel = 2 + option_fishing_rod_and_shovel = 3 + option_golden_fishing_rod = 4 + option_golden_fishing_rod_and_shovel = 5 + default = 1 + +class MinShopCheckLogic(Choice): + """ + Determines the minimum cost of a shop item that will have the shop check logic applied to it. + If the cost of a shop item is less than this value, no items will be required to access it. + This is based on the vanilla prices of the shop item. The set cost multiplier will not affect this value. + """ + display_name = "Minimum Shop Check Logic Application" + option_40_coins = 0 + option_100_coins = 1 + option_400_coins = 2 + default = 1 + @dataclass class ShortHikeOptions(PerGameCommonOptions): start_inventory_from_pool: StartInventoryPool @@ -84,6 +134,37 @@ class ShortHikeOptions(PerGameCommonOptions): golden_feathers: GoldenFeathers silver_feathers: SilverFeathers buckets: Buckets + sticks: Sticks + toy_shovels: ToyShovels golden_feather_progression: GoldenFeatherProgression cost_multiplier: CostMultiplier filler_coin_amount: FillerCoinAmount + random_walkie_talkie: RandomWalkieTalkie + easier_races: EasierRaces + shop_check_logic: ShopCheckLogic + min_shop_check_logic: MinShopCheckLogic + +shorthike_option_groups = [ + OptionGroup("General Options", [ + Goal, + FillerCoinAmount, + RandomWalkieTalkie + ]), + OptionGroup("Logic Options", [ + GoldenFeatherProgression, + EasierRaces + ]), + OptionGroup("Item Pool Options", [ + GoldenFeathers, + SilverFeathers, + Buckets, + Sticks, + ToyShovels + ]), + OptionGroup("Shop Options", [ + CoinsInShops, + CostMultiplier, + ShopCheckLogic, + MinShopCheckLogic + ]) +] diff --git a/worlds/shorthike/Rules.py b/worlds/shorthike/Rules.py index 73a16434219e..4a71ebd3c80a 100644 --- a/worlds/shorthike/Rules.py +++ b/worlds/shorthike/Rules.py @@ -1,4 +1,5 @@ from worlds.generic.Rules import forbid_items_for_player, add_rule +from worlds.shorthike.Options import Goal, GoldenFeatherProgression, MinShopCheckLogic, ShopCheckLogic def create_rules(self, location_table): multiworld = self.multiworld @@ -11,11 +12,23 @@ def create_rules(self, location_table): forbid_items_for_player(multiworld.get_location(loc["name"], player), self.item_name_groups['Maps'], player) add_rule(multiworld.get_location(loc["name"], player), lambda state: state.has("Shovel", player)) + + # Shop Rules if loc["purchase"] and not options.coins_in_shops: forbid_items_for_player(multiworld.get_location(loc["name"], player), self.item_name_groups['Coins'], player) + if loc["purchase"] >= get_min_shop_logic_cost(self) and options.shop_check_logic != ShopCheckLogic.option_nothing: + if options.shop_check_logic in {ShopCheckLogic.option_fishing_rod, ShopCheckLogic.option_fishing_rod_and_shovel}: + add_rule(multiworld.get_location(loc["name"], player), + lambda state: state.has("Progressive Fishing Rod", player)) + if options.shop_check_logic in {ShopCheckLogic.option_golden_fishing_rod, ShopCheckLogic.option_golden_fishing_rod_and_shovel}: + add_rule(multiworld.get_location(loc["name"], player), + lambda state: state.has("Progressive Fishing Rod", player, 2)) + if options.shop_check_logic in {ShopCheckLogic.option_shovel, ShopCheckLogic.option_fishing_rod_and_shovel, ShopCheckLogic.option_golden_fishing_rod_and_shovel}: + add_rule(multiworld.get_location(loc["name"], player), + lambda state: state.has("Shovel", player)) # Minimum Feather Rules - if options.golden_feather_progression != 2: + if options.golden_feather_progression != GoldenFeatherProgression.option_hard: min_feathers = get_min_feathers(self, loc["minGoldenFeathers"], loc["minGoldenFeathersEasy"]) if options.buckets > 0 and loc["minGoldenFeathersBucket"] < min_feathers: @@ -32,11 +45,11 @@ def create_rules(self, location_table): # Fishing Rules add_rule(multiworld.get_location("Catch 3 Fish Reward", player), - lambda state: state.has("Fishing Rod", player)) + lambda state: state.has("Progressive Fishing Rod", player)) add_rule(multiworld.get_location("Catch Fish with Permit", player), - lambda state: state.has("Fishing Rod", player)) + lambda state: state.has("Progressive Fishing Rod", player)) add_rule(multiworld.get_location("Catch All Fish Reward", player), - lambda state: state.has("Fishing Rod", player)) + lambda state: state.has("Progressive Fishing Rod", player, 2)) # Misc Rules add_rule(multiworld.get_location("Return Camping Permit", player), @@ -59,15 +72,34 @@ def create_rules(self, location_table): lambda state: state.has("Stick", player)) add_rule(multiworld.get_location("Beachstickball (30 Hits)", player), lambda state: state.has("Stick", player)) + + # Race Rules + if options.easier_races: + add_rule(multiworld.get_location("Lighthouse Race Reward", player), + lambda state: state.has("Running Shoes", player)) + add_rule(multiworld.get_location("Old Building Race Reward", player), + lambda state: state.has("Running Shoes", player)) + add_rule(multiworld.get_location("Hawk Peak Race Reward", player), + lambda state: state.has("Running Shoes", player)) def get_min_feathers(self, min_golden_feathers, min_golden_feathers_easy): options = self.options min_feathers = min_golden_feathers - if options.golden_feather_progression == 0: + if options.golden_feather_progression == GoldenFeatherProgression.option_easy: min_feathers = min_golden_feathers_easy if min_feathers > options.golden_feathers: - if options.goal != 1 and options.goal != 3: + if options.goal not in {Goal.option_help_everyone, Goal.option_photo}: min_feathers = options.golden_feathers return min_feathers + +def get_min_shop_logic_cost(self): + options = self.options + + if options.min_shop_check_logic == MinShopCheckLogic.option_40_coins: + return 40 + elif options.min_shop_check_logic == MinShopCheckLogic.option_100_coins: + return 100 + elif options.min_shop_check_logic == MinShopCheckLogic.option_400_coins: + return 400 diff --git a/worlds/shorthike/__init__.py b/worlds/shorthike/__init__.py index 470b061c4bc0..299169a40c6b 100644 --- a/worlds/shorthike/__init__.py +++ b/worlds/shorthike/__init__.py @@ -1,12 +1,11 @@ -from collections import Counter from typing import ClassVar, Dict, Any, Type -from BaseClasses import Region, Location, Item, Tutorial +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 +from .Options import ShortHikeOptions, shorthike_option_groups class ShortHikeWeb(WebWorld): theme = "ocean" @@ -18,6 +17,7 @@ class ShortHikeWeb(WebWorld): "setup/en", ["Chandler"] )] + option_groups = shorthike_option_groups class ShortHikeWorld(World): """ @@ -47,9 +47,14 @@ def create_item(self, name: str) -> "ShortHikeItem": item_id: int = self.item_name_to_id[name] id = item_id - base_id - 1 - return ShortHikeItem(name, item_table[id]["classification"], item_id, player=self.player) + 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"] @@ -57,18 +62,28 @@ def create_items(self) -> None: continue else: for i in range(count): - self.multiworld.itempool.append(self.create_item(item["name"])) + 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 - junk = 45 - self.options.silver_feathers - feather_count - self.options.buckets - self.multiworld.itempool += [self.create_item(self.get_filler_item_name()) for _ in range(junk)] - self.multiworld.itempool += [self.create_item("Golden Feather") for _ in range(feather_count)] - self.multiworld.itempool += [self.create_item("Silver Feather") for _ in range(self.options.silver_feathers)] - self.multiworld.itempool += [self.create_item("Bucket") for _ in range(self.options.buckets)] + 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) @@ -92,20 +107,23 @@ def create_regions(self) -> None: 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.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))) + 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.has("Golden Feather", self.player, 12) - and state.has("Toy Shovel", self.player) and state.has("Camping Permit", self.player) - and state.has("Motorboat Key", self.player) and state.has("Headband", self.player) - and state.has("Wristwatch", self.player) and state.has("Seashell", self.player, 15) - and state.has("Shell Necklace", self.player)) + 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.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)) - and state.has("Fishing Rod", self.player)) + 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) @@ -117,6 +135,9 @@ def fill_slot_data(self) -> Dict[str, Any]: "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 = {