diff --git a/worlds/stardew_valley/__init__.py b/worlds/stardew_valley/__init__.py index 177b6436..24ffa8c1 100644 --- a/worlds/stardew_valley/__init__.py +++ b/worlds/stardew_valley/__init__.py @@ -11,6 +11,7 @@ from .locations import location_table, create_locations, LocationData from .logic import StardewLogic, StardewRule, True_, MAX_MONTHS from .options import StardewValleyOptions, SeasonRandomization, Goal, BundleRandomization, BundlePrice, NumberOfLuckBuffs, NumberOfMovementBuffs, \ BackpackProgression, BuildingProgression, ExcludeGingerIsland +from .presets import sv_options_presets from .regions import create_regions from .rules import set_rules from worlds.generic.Rules import set_rule @@ -34,6 +35,7 @@ class StardewItem(Item): class StardewWebWorld(WebWorld): theme = "dirt" bug_report_page = "https://github.com/agilbert1412/StardewArchipelago/issues/new?labels=bug&title=%5BBug%5D%3A+Brief+Description+of+bug+here" + options_presets = sv_options_presets tutorials = [ Tutorial( diff --git a/worlds/stardew_valley/data/items.csv b/worlds/stardew_valley/data/items.csv index a3d61e8b..3c4ddb84 100644 --- a/worlds/stardew_valley/data/items.csv +++ b/worlds/stardew_valley/data/items.csv @@ -1,7 +1,7 @@ id,name,classification,groups,mod_name 0,Joja Cola,filler,TRASH, -15,Rusty Key,progression,MUSEUM, -16,Dwarvish Translation Guide,progression,MUSEUM, +15,Rusty Key,progression,, +16,Dwarvish Translation Guide,progression,, 17,Bridge Repair,progression,COMMUNITY_REWARD, 18,Greenhouse,progression,COMMUNITY_REWARD, 19,Glittering Boulder Removed,progression,COMMUNITY_REWARD, diff --git a/worlds/stardew_valley/items.py b/worlds/stardew_valley/items.py index 2d28b4de..a5a370aa 100644 --- a/worlds/stardew_valley/items.py +++ b/worlds/stardew_valley/items.py @@ -300,15 +300,15 @@ def create_stardrops(item_factory: StardewItemFactory, options: StardewValleyOpt def create_museum_items(item_factory: StardewItemFactory, options: StardewValleyOptions, items: List[Item]): - if options.museumsanity == Museumsanity.option_none: - return - items.extend(item_factory(item) for item in ["Magic Rock Candy"] * 5) - items.extend(item_factory(item) for item in ["Ancient Seeds"] * 5) - items.extend(item_factory(item) for item in ["Traveling Merchant Metal Detector"] * 4) - items.append(item_factory("Ancient Seeds Recipe")) - items.append(item_factory("Stardrop")) items.append(item_factory("Rusty Key")) items.append(item_factory("Dwarvish Translation Guide")) + items.append(item_factory("Ancient Seeds Recipe")) + if options.museumsanity == Museumsanity.option_none: + return + items.extend(item_factory(item) for item in ["Magic Rock Candy"] * 10) + items.extend(item_factory(item) for item in ["Ancient Seeds"] * 5) + items.extend(item_factory(item) for item in ["Traveling Merchant Metal Detector"] * 4) + items.append(item_factory("Stardrop")) def create_friendsanity_items(item_factory: StardewItemFactory, options: StardewValleyOptions, items: List[Item]): diff --git a/worlds/stardew_valley/logic.py b/worlds/stardew_valley/logic.py index 0746bd77..5a6244cf 100644 --- a/worlds/stardew_valley/logic.py +++ b/worlds/stardew_valley/logic.py @@ -8,7 +8,7 @@ from .data import all_fish, FishItem, all_purchasable_seeds, SeedItem, all_crops from .data.bundle_data import BundleItem from .data.crops_data import crops_by_name from .data.fish_data import island_fish -from .data.museum_data import all_museum_items, MuseumItem, all_museum_artifacts, dwarf_scrolls, all_museum_minerals +from .data.museum_data import all_museum_items, MuseumItem, all_museum_artifacts, all_museum_minerals from .data.recipe_data import all_cooking_recipes, CookingRecipe, RecipeSource, FriendshipSource, QueenOfSauceSource, \ StarterSource, ShopSource, SkillSource from .data.villagers_data import all_villagers_by_name, Villager @@ -1283,8 +1283,6 @@ class StardewLogic: return self.has_lived_months(8) def can_speak_dwarf(self) -> StardewRule: - if self.options.museumsanity == Museumsanity.option_none: - return And([self.can_donate_museum_item(item) for item in dwarf_scrolls]) return self.received("Dwarvish Translation Guide") def can_donate_museum_item(self, item: MuseumItem) -> StardewRule: @@ -1370,9 +1368,6 @@ class StardewLogic: return self.received("Month End", number) def has_rusty_key(self) -> StardewRule: - if self.options.museumsanity == Museumsanity.option_none: - required_donations = 80 # It's 60, but without a metal detector I'd rather overshoot so players don't get screwed by RNG - return self.has([item.name for item in all_museum_items], required_donations) & self.can_reach_region(Region.museum) return self.received(Wallet.rusty_key) def can_win_egg_hunt(self) -> StardewRule: diff --git a/worlds/stardew_valley/options.py b/worlds/stardew_valley/options.py index f462f507..d85bbf06 100644 --- a/worlds/stardew_valley/options.py +++ b/worlds/stardew_valley/options.py @@ -7,15 +7,15 @@ from .mods.mod_data import ModNames class Goal(Choice): """What's your goal with this play-through? - Community Center: The world will be completed once you complete the Community Center. - Grandpa's Evaluation: The world will be completed once 4 candles are lit at Grandpa's Shrine. - Bottom of the Mines: The world will be completed once you reach level 120 in the mineshaft. - Cryptic Note: The world will be completed once you complete the quest "Cryptic Note" where Mr Qi asks you to reach floor 100 in the Skull Cavern. - Master Angler: The world will be completed once you have caught every fish in the game. Pairs well with Fishsanity. - Complete Collection: The world will be completed once you have completed the museum by donating every possible item. Pairs well with Museumsanity. - Full House: The world will be completed once you get married and have two kids. Pairs well with Friendsanity. - Greatest Walnut Hunter: The world will be completed once you find all 130 Golden Walnuts - Perfection: The world will be completed once you attain Perfection, based on the vanilla definition. + Community Center: Complete the Community Center. + Grandpa's Evaluation: Succeed grandpa's evaluation with 4 lit candles. + Bottom of the Mines: Reach level 120 in the mineshaft. + Cryptic Note: Complete the quest "Cryptic Note" where Mr Qi asks you to reach floor 100 in the Skull Cavern. + Master Angler: Catch every fish in the game. Pairs well with Fishsanity. + Complete Collection: Complete the museum by donating every possible item. Pairs well with Museumsanity. + Full House: Get married and have two children. Pairs well with Friendsanity. + Greatest Walnut Hunter: Find all 130 Golden Walnuts + Perfection: Attain Perfection, based on the vanilla definition. """ internal_name = "goal" display_name = "Goal" @@ -50,7 +50,7 @@ class Goal(Choice): class StartingMoney(SpecialRange): """Amount of gold when arriving at the farm. - Set to -1 or unlimited for infinite money in this playthrough""" + Set to -1 or unlimited for infinite money""" internal_name = "starting_money" display_name = "Starting Gold" range_start = -1 @@ -117,10 +117,10 @@ class BundlePrice(Choice): class EntranceRandomization(Choice): """Should area entrances be randomized? Disabled: No entrance randomization is done - Pelican Town: Only buildings in the main town area are randomized among each other - Non Progression: Only buildings that are always available are randomized with each other - Buildings: All Entrances that Allow you to enter a building using a door are randomized with each other - Chaos: Same as above, but the entrances get reshuffled every single day! + Pelican Town: Only doors in the main town area are randomized with each other + Non Progression: Only entrances that are always available are randomized with each other + Buildings: All Entrances that Allow you to enter a building are randomized with each other + Chaos: Same as "Buildings", but the entrances get reshuffled every single day! """ # Everything: All buildings and areas are randomized with each other # Chaos, same as everything: but the buildings are shuffled again every in-game day. You can't learn it! @@ -144,11 +144,10 @@ class EntranceRandomization(Choice): class SeasonRandomization(Choice): """Should seasons be randomized? - All settings allow you to choose which season you want to play next (from those unlocked) at the end of a season. - Disabled: You will start in Spring with all seasons unlocked. - Randomized: The seasons will be unlocked randomly as Archipelago items. - Randomized Not Winter: The seasons are randomized, but you're guaranteed not to start with winter. - Progressive: You will start in Spring and unlock the seasons in their original order. + Disabled: Start in Spring with all seasons unlocked. + Randomized: Start in a random season and the other 3 must be unlocked randomly. + Randomized Not Winter: Same as randomized, but the start season is guaranteed not to be winter. + Progressive: Start in Spring and unlock the seasons in their original order. """ internal_name = "season_randomization" display_name = "Season Randomization" @@ -163,20 +162,21 @@ class Cropsanity(Choice): """Formerly named "Seed Shuffle" Pierre now sells a random amount of seasonal seeds and Joja sells them without season requirements, but only in huge packs. Disabled: All the seeds are unlocked from the start, there are no location checks for growing and harvesting crops - Shuffled: Seeds are unlocked as archipelago item, for each seed there is a location check for growing and harvesting that crop + Shuffled: Seeds are unlocked as archipelago items, for each seed there is a location check for growing and harvesting that crop """ internal_name = "cropsanity" display_name = "Cropsanity" default = 1 option_disabled = 0 - option_shuffled = 1 + option_enabled = 1 + alias_shuffled = option_enabled class BackpackProgression(Choice): - """How is the backpack progression handled? - Vanilla: You can buy them at Pierre's General Store. + """Shuffle the backpack? + Vanilla: You can buy backpacks at Pierre's General Store. Progressive: You will randomly find Progressive Backpack upgrades. - Early Progressive: You can expect your first Backpack in sphere 1. + Early Progressive: Same as progressive, but one backpack will be placed early in the multiworld. """ internal_name = "backpack_progression" display_name = "Backpack Progression" @@ -187,8 +187,8 @@ class BackpackProgression(Choice): class ToolProgression(Choice): - """How is the tool progression handled? - Vanilla: Clint will upgrade your tools with ore. + """Shuffle the tool upgrades? + Vanilla: Clint will upgrade your tools with metal bars. Progressive: You will randomly find Progressive Tool upgrades.""" internal_name = "tool_progression" display_name = "Tool Progression" @@ -198,12 +198,11 @@ class ToolProgression(Choice): class ElevatorProgression(Choice): - """How is Elevator progression handled? - Vanilla: You will unlock new elevator floors for yourself. - Progressive: You will randomly find Progressive Mine Elevators to go deeper. Locations are sent for reaching - every elevator level. - Progressive from previous floor: Same as progressive, but you must reach elevator floors on your own, - you cannot use the elevator to check elevator locations""" + """Shuffle the elevator? + Vanilla: Reaching a mineshaft floor unlocks the elevator for it + Progressive: You will randomly find Progressive Mine Elevators to go deeper. + Progressive from previous floor: Same as progressive, but you cannot use the elevator to check elevator locations. + You must reach elevator floors on your own.""" internal_name = "elevator_progression" display_name = "Elevator Progression" default = 2 @@ -213,10 +212,9 @@ class ElevatorProgression(Choice): class SkillProgression(Choice): - """How is the skill progression handled? - Vanilla: You will level up and get the normal reward at each level. - Progressive: The xp will be earned internally, locations will be sent when you earn a level. Your real - levels will be scattered around the multiworld.""" + """Shuffle skill levels? + Vanilla: Leveling up skills is normal + Progressive: Skill levels are unlocked randomly, and earning xp sends checks""" internal_name = "skill_progression" display_name = "Skill Progression" default = 1 @@ -225,11 +223,11 @@ class SkillProgression(Choice): class BuildingProgression(Choice): - """How is the building progression handled? - Vanilla: You will buy each building normally. + """Shuffle Carpenter Buildings? + Vanilla: You can buy each building normally. Progressive: You will receive the buildings and will be able to build the first one of each type for free, once it is received. If you want more of the same building, it will cost the vanilla price. - Progressive early shipping bin: You can expect your shipping bin in sphere 1. + Progressive early shipping bin: Same as Progressive, but the shipping bin will be placed early in the multiworld. """ internal_name = "building_progression" display_name = "Building Progression" @@ -240,10 +238,10 @@ class BuildingProgression(Choice): class FestivalLocations(Choice): - """Locations for attending and participating in festivals - With Disabled, you do not need to attend festivals - With Easy, there are checks for participating in festivals - With Hard, the festival checks are only granted when the player performs well in the festival + """Shuffle Festival Activities? + Disabled: You do not need to attend festivals + Easy: Every festival has checks, but they are easy and usually only require attendance + Hard: Festivals have more checks, and many require performing well, not just attending """ internal_name = "festival_locations" display_name = "Festival Locations" @@ -254,11 +252,10 @@ class FestivalLocations(Choice): class ArcadeMachineLocations(Choice): - """How are the Arcade Machines handled? - Disabled: The arcade machines are not included in the Archipelago shuffling. + """Shuffle the arcade machines? + Disabled: The arcade machines are not included. Victories: Each Arcade Machine will contain one check on victory - Victories Easy: The arcade machines are both made considerably easier to be more accessible for the average - player. + Victories Easy: Same as Victories, but both games are made considerably easier. Full Shuffling: The arcade machines will contain multiple checks each, and different buffs that make the game easier are in the item pool. Junimo Kart has one check at the end of each level. Journey of the Prairie King has one check after each boss, plus one check for each vendor equipment. @@ -273,10 +270,10 @@ class ArcadeMachineLocations(Choice): class SpecialOrderLocations(Choice): - """How are the Special Orders handled? + """Shuffle Special Orders? Disabled: The special orders are not included in the Archipelago shuffling. Board Only: The Special Orders on the board in town are location checks - Board and Qi: The Special Orders from Qi's walnut room are checks, as well as the board in town + Board and Qi: The Special Orders from Mr Qi's walnut room are checks, in addition to the board in town """ internal_name = "special_order_locations" display_name = "Special Order Locations" @@ -287,7 +284,7 @@ class SpecialOrderLocations(Choice): class HelpWantedLocations(SpecialRange): - """How many "Help Wanted" quests need to be completed as Archipelago Locations + """Include location checks for Help Wanted quests Out of every 7 quests, 4 will be item deliveries, and then 1 of each for: Fishing, Gathering and Slaying Monsters. Choosing a multiple of 7 is recommended.""" internal_name = "help_wanted_locations" @@ -307,7 +304,7 @@ class HelpWantedLocations(SpecialRange): class Fishsanity(Choice): - """Locations for catching fish? + """Locations for catching a fish the first time? None: There are no locations for catching fish Legendaries: Each of the 5 legendary fish are checks Special: A curated selection of strong fish are checks @@ -336,7 +333,7 @@ class Museumsanity(Choice): None: There are no locations for donating artifacts and minerals to the museum Milestones: The donation milestones from the vanilla game are checks Randomized: A random selection of minerals and artifacts are checks - All: Every single donation will be a check + All: Every single donation is a check """ internal_name = "museumsanity" display_name = "Museumsanity" @@ -348,12 +345,12 @@ class Museumsanity(Choice): class Friendsanity(Choice): - """Locations for friendships? - None: There are no checks for befriending villagers - Bachelors: Each heart of a bachelor is a check - Starting NPCs: Each heart for npcs that are immediately available is a check - All: Every heart with every NPC is a check, including Leo, Kent, Sandy, etc - All With Marriage: Marriage candidates must also be dated, married, and befriended up to 14 hearts. + """Shuffle Friendships? + None: Friendship hearts are earned normally + Bachelors: Hearts with bachelors are shuffled + Starting NPCs: Hearts for NPCs available immediately are checks + All: Hearts for all npcs are checks, including Leo, Kent, Sandy, etc + All With Marriage: Hearts for all npcs are checks, including romance hearts up to 14 when applicable """ internal_name = "friendsanity" display_name = "Friendsanity" @@ -368,7 +365,7 @@ class Friendsanity(Choice): # Conditional Setting - Friendsanity not None class FriendsanityHeartSize(Range): - """If using friendsanity, how many hearts are received per item, and how many hearts must be earned to send a check + """If using friendsanity, how many hearts are received per heart item, and how many hearts must be earned to send a check A higher value will lead to fewer heart items in the item pool, reducing bloat""" internal_name = "friendsanity_heart_size" display_name = "Friendsanity Heart Size" @@ -411,6 +408,7 @@ class ExcludeGingerIsland(Toggle): class TrapItems(Choice): """When rolling filler items, including resource packs, the game can also roll trap items. + Trap items are negative items that cause problems or annoyances for the player This setting is for choosing if traps will be in the item pool, and if so, how punishing they will be. """ internal_name = "trap_items" @@ -441,14 +439,16 @@ class MultipleDaySleepCost(SpecialRange): special_range_names = { "free": 0, - "cheap": 25, - "medium": 50, - "expensive": 100, + "cheap": 10, + "medium": 25, + "expensive": 50, + "very expensive": 100, } class ExperienceMultiplier(SpecialRange): - """How fast you want to earn skill experience. A lower setting mean less experience. + """How fast you want to earn skill experience. + A lower setting mean less experience. A higher setting means more experience.""" internal_name = "experience_multiplier" display_name = "Experience Multiplier" @@ -513,14 +513,15 @@ class QuickStart(Toggle): class Gifting(Toggle): - """Do you want to enable gifting items to and from other Stardew Valley worlds?""" + """Do you want to enable gifting items to and from other Archipelago slots? + Items can only be sent to games that also support gifting""" internal_name = "gifting" display_name = "Gifting" default = 1 class Mods(OptionSet): - """List of mods that will be considered for shuffling.""" + """List of mods that will be included in the shuffling.""" internal_name = "mods" display_name = "Mods" valid_keys = { diff --git a/worlds/stardew_valley/presets.py b/worlds/stardew_valley/presets.py new file mode 100644 index 00000000..8823c52e --- /dev/null +++ b/worlds/stardew_valley/presets.py @@ -0,0 +1,323 @@ +from typing import Any, Dict + +from Options import Accessibility, ProgressionBalancing, DeathLink +from .options import Goal, StartingMoney, ProfitMargin, BundleRandomization, BundlePrice, EntranceRandomization, SeasonRandomization, Cropsanity, \ + BackpackProgression, ToolProgression, ElevatorProgression, SkillProgression, BuildingProgression, FestivalLocations, ArcadeMachineLocations, \ + SpecialOrderLocations, HelpWantedLocations, Fishsanity, Museumsanity, Friendsanity, FriendsanityHeartSize, NumberOfMovementBuffs, NumberOfLuckBuffs, \ + ExcludeGingerIsland, TrapItems, MultipleDaySleepEnabled, MultipleDaySleepCost, ExperienceMultiplier, FriendshipMultiplier, DebrisMultiplier, QuickStart, \ + Gifting + +all_random_settings = { + "progression_balancing": "random", + "accessibility": "random", + Goal.internal_name: "random", + StartingMoney.internal_name: "random", + ProfitMargin.internal_name: "random", + BundleRandomization.internal_name: "random", + BundlePrice.internal_name: "random", + EntranceRandomization.internal_name: "random", + SeasonRandomization.internal_name: "random", + Cropsanity.internal_name: "random", + BackpackProgression.internal_name: "random", + ToolProgression.internal_name: "random", + ElevatorProgression.internal_name: "random", + SkillProgression.internal_name: "random", + BuildingProgression.internal_name: "random", + FestivalLocations.internal_name: "random", + ArcadeMachineLocations.internal_name: "random", + SpecialOrderLocations.internal_name: "random", + HelpWantedLocations.internal_name: "random", + Fishsanity.internal_name: "random", + Museumsanity.internal_name: "random", + Friendsanity.internal_name: "random", + FriendsanityHeartSize.internal_name: "random", + NumberOfMovementBuffs.internal_name: "random", + NumberOfLuckBuffs.internal_name: "random", + ExcludeGingerIsland.internal_name: "random", + TrapItems.internal_name: "random", + MultipleDaySleepEnabled.internal_name: "random", + MultipleDaySleepCost.internal_name: "random", + ExperienceMultiplier.internal_name: "random", + FriendshipMultiplier.internal_name: "random", + DebrisMultiplier.internal_name: "random", + QuickStart.internal_name: "random", + Gifting.internal_name: "random", + "death_link": "random", +} + +easy_settings = { + "progression_balancing": ProgressionBalancing.default, + "accessibility": Accessibility.option_items, + Goal.internal_name: Goal.option_community_center, + StartingMoney.internal_name: "very rich", + ProfitMargin.internal_name: "double", + BundleRandomization.internal_name: BundleRandomization.option_thematic, + BundlePrice.internal_name: BundlePrice.option_cheap, + EntranceRandomization.internal_name: EntranceRandomization.option_disabled, + SeasonRandomization.internal_name: SeasonRandomization.option_randomized_not_winter, + Cropsanity.internal_name: Cropsanity.option_enabled, + BackpackProgression.internal_name: BackpackProgression.option_early_progressive, + ToolProgression.internal_name: ToolProgression.option_progressive, + ElevatorProgression.internal_name: ElevatorProgression.option_progressive, + SkillProgression.internal_name: SkillProgression.option_progressive, + BuildingProgression.internal_name: BuildingProgression.option_progressive_early_shipping_bin, + FestivalLocations.internal_name: FestivalLocations.option_easy, + ArcadeMachineLocations.internal_name: ArcadeMachineLocations.option_disabled, + SpecialOrderLocations.internal_name: SpecialOrderLocations.option_disabled, + HelpWantedLocations.internal_name: "minimum", + Fishsanity.internal_name: Fishsanity.option_only_easy_fish, + Museumsanity.internal_name: Museumsanity.option_milestones, + Friendsanity.internal_name: Friendsanity.option_none, + FriendsanityHeartSize.internal_name: 4, + NumberOfMovementBuffs.internal_name: 8, + NumberOfLuckBuffs.internal_name: 8, + ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_true, + TrapItems.internal_name: TrapItems.option_easy, + MultipleDaySleepEnabled.internal_name: MultipleDaySleepEnabled.option_true, + MultipleDaySleepCost.internal_name: "free", + ExperienceMultiplier.internal_name: "triple", + FriendshipMultiplier.internal_name: "quadruple", + DebrisMultiplier.internal_name: DebrisMultiplier.option_quarter, + QuickStart.internal_name: QuickStart.option_true, + Gifting.internal_name: Gifting.option_true, + "death_link": "false", +} + +medium_settings = { + "progression_balancing": 25, + "accessibility": Accessibility.option_locations, + Goal.internal_name: Goal.option_community_center, + StartingMoney.internal_name: "rich", + ProfitMargin.internal_name: 150, + BundleRandomization.internal_name: BundleRandomization.option_thematic, + BundlePrice.internal_name: BundlePrice.option_normal, + EntranceRandomization.internal_name: EntranceRandomization.option_non_progression, + SeasonRandomization.internal_name: SeasonRandomization.option_randomized, + Cropsanity.internal_name: Cropsanity.option_enabled, + BackpackProgression.internal_name: BackpackProgression.option_early_progressive, + ToolProgression.internal_name: ToolProgression.option_progressive, + ElevatorProgression.internal_name: ElevatorProgression.option_progressive_from_previous_floor, + SkillProgression.internal_name: SkillProgression.option_progressive, + BuildingProgression.internal_name: BuildingProgression.option_progressive_early_shipping_bin, + FestivalLocations.internal_name: FestivalLocations.option_hard, + ArcadeMachineLocations.internal_name: ArcadeMachineLocations.option_victories_easy, + SpecialOrderLocations.internal_name: SpecialOrderLocations.option_board_only, + HelpWantedLocations.internal_name: "normal", + Fishsanity.internal_name: Fishsanity.option_exclude_legendaries, + Museumsanity.internal_name: Museumsanity.option_milestones, + Friendsanity.internal_name: Friendsanity.option_starting_npcs, + FriendsanityHeartSize.internal_name: 4, + NumberOfMovementBuffs.internal_name: 6, + NumberOfLuckBuffs.internal_name: 6, + ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_true, + TrapItems.internal_name: TrapItems.option_medium, + MultipleDaySleepEnabled.internal_name: MultipleDaySleepEnabled.option_true, + MultipleDaySleepCost.internal_name: "free", + ExperienceMultiplier.internal_name: "double", + FriendshipMultiplier.internal_name: "triple", + DebrisMultiplier.internal_name: DebrisMultiplier.option_half, + QuickStart.internal_name: QuickStart.option_true, + Gifting.internal_name: Gifting.option_true, + "death_link": "false", +} + +hard_settings = { + "progression_balancing": 0, + "accessibility": Accessibility.option_locations, + Goal.internal_name: Goal.option_grandpa_evaluation, + StartingMoney.internal_name: "extra", + ProfitMargin.internal_name: "normal", + BundleRandomization.internal_name: BundleRandomization.option_thematic, + BundlePrice.internal_name: BundlePrice.option_expensive, + EntranceRandomization.internal_name: EntranceRandomization.option_buildings, + SeasonRandomization.internal_name: SeasonRandomization.option_randomized, + Cropsanity.internal_name: Cropsanity.option_enabled, + BackpackProgression.internal_name: BackpackProgression.option_progressive, + ToolProgression.internal_name: ToolProgression.option_progressive, + ElevatorProgression.internal_name: ElevatorProgression.option_progressive_from_previous_floor, + SkillProgression.internal_name: SkillProgression.option_progressive, + BuildingProgression.internal_name: BuildingProgression.option_progressive, + FestivalLocations.internal_name: FestivalLocations.option_hard, + ArcadeMachineLocations.internal_name: ArcadeMachineLocations.option_full_shuffling, + SpecialOrderLocations.internal_name: SpecialOrderLocations.option_board_qi, + HelpWantedLocations.internal_name: "lots", + Fishsanity.internal_name: Fishsanity.option_all, + Museumsanity.internal_name: Museumsanity.option_all, + Friendsanity.internal_name: Friendsanity.option_all, + FriendsanityHeartSize.internal_name: 4, + NumberOfMovementBuffs.internal_name: 4, + NumberOfLuckBuffs.internal_name: 4, + ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_false, + TrapItems.internal_name: TrapItems.option_hard, + MultipleDaySleepEnabled.internal_name: MultipleDaySleepEnabled.option_true, + MultipleDaySleepCost.internal_name: "cheap", + ExperienceMultiplier.internal_name: "vanilla", + FriendshipMultiplier.internal_name: "double", + DebrisMultiplier.internal_name: DebrisMultiplier.option_vanilla, + QuickStart.internal_name: QuickStart.option_true, + Gifting.internal_name: Gifting.option_true, + "death_link": "true", +} + +nightmare_settings = { + "progression_balancing": 0, + "accessibility": Accessibility.option_locations, + Goal.internal_name: Goal.option_community_center, + StartingMoney.internal_name: "vanilla", + ProfitMargin.internal_name: "half", + BundleRandomization.internal_name: BundleRandomization.option_shuffled, + BundlePrice.internal_name: BundlePrice.option_expensive, + EntranceRandomization.internal_name: EntranceRandomization.option_buildings, + SeasonRandomization.internal_name: SeasonRandomization.option_randomized, + Cropsanity.internal_name: Cropsanity.option_enabled, + BackpackProgression.internal_name: BackpackProgression.option_progressive, + ToolProgression.internal_name: ToolProgression.option_progressive, + ElevatorProgression.internal_name: ElevatorProgression.option_progressive_from_previous_floor, + SkillProgression.internal_name: SkillProgression.option_progressive, + BuildingProgression.internal_name: BuildingProgression.option_progressive, + FestivalLocations.internal_name: FestivalLocations.option_hard, + ArcadeMachineLocations.internal_name: ArcadeMachineLocations.option_full_shuffling, + SpecialOrderLocations.internal_name: SpecialOrderLocations.option_board_qi, + HelpWantedLocations.internal_name: "maximum", + Fishsanity.internal_name: Fishsanity.option_special, + Museumsanity.internal_name: Museumsanity.option_all, + Friendsanity.internal_name: Friendsanity.option_all_with_marriage, + FriendsanityHeartSize.internal_name: 4, + NumberOfMovementBuffs.internal_name: 2, + NumberOfLuckBuffs.internal_name: 2, + ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_false, + TrapItems.internal_name: TrapItems.option_hell, + MultipleDaySleepEnabled.internal_name: MultipleDaySleepEnabled.option_true, + MultipleDaySleepCost.internal_name: "expensive", + ExperienceMultiplier.internal_name: "half", + FriendshipMultiplier.internal_name: "vanilla", + DebrisMultiplier.internal_name: DebrisMultiplier.option_vanilla, + QuickStart.internal_name: QuickStart.option_false, + Gifting.internal_name: Gifting.option_true, + "death_link": "true", +} + +short_settings = { + "progression_balancing": ProgressionBalancing.default, + "accessibility": Accessibility.option_items, + Goal.internal_name: Goal.option_bottom_of_the_mines, + StartingMoney.internal_name: "filthy rich", + ProfitMargin.internal_name: "quadruple", + BundleRandomization.internal_name: BundleRandomization.option_thematic, + BundlePrice.internal_name: BundlePrice.option_very_cheap, + EntranceRandomization.internal_name: EntranceRandomization.option_disabled, + SeasonRandomization.internal_name: SeasonRandomization.option_randomized_not_winter, + Cropsanity.internal_name: Cropsanity.option_disabled, + BackpackProgression.internal_name: BackpackProgression.option_early_progressive, + ToolProgression.internal_name: ToolProgression.option_progressive, + ElevatorProgression.internal_name: ElevatorProgression.option_progressive_from_previous_floor, + SkillProgression.internal_name: SkillProgression.option_progressive, + BuildingProgression.internal_name: BuildingProgression.option_progressive_early_shipping_bin, + FestivalLocations.internal_name: FestivalLocations.option_disabled, + ArcadeMachineLocations.internal_name: ArcadeMachineLocations.option_disabled, + SpecialOrderLocations.internal_name: SpecialOrderLocations.option_disabled, + HelpWantedLocations.internal_name: "none", + Fishsanity.internal_name: Fishsanity.option_none, + Museumsanity.internal_name: Museumsanity.option_none, + Friendsanity.internal_name: Friendsanity.option_none, + FriendsanityHeartSize.internal_name: 4, + NumberOfMovementBuffs.internal_name: 10, + NumberOfLuckBuffs.internal_name: 10, + ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_true, + TrapItems.internal_name: TrapItems.option_easy, + MultipleDaySleepEnabled.internal_name: MultipleDaySleepEnabled.option_true, + MultipleDaySleepCost.internal_name: "free", + ExperienceMultiplier.internal_name: "quadruple", + FriendshipMultiplier.internal_name: 800, + DebrisMultiplier.internal_name: DebrisMultiplier.option_none, + QuickStart.internal_name: QuickStart.option_true, + Gifting.internal_name: Gifting.option_true, + "death_link": "false", +} + +lowsanity_settings = { + "progression_balancing": ProgressionBalancing.default, + "accessibility": Accessibility.option_minimal, + Goal.internal_name: Goal.default, + StartingMoney.internal_name: StartingMoney.default, + ProfitMargin.internal_name: ProfitMargin.default, + BundleRandomization.internal_name: BundleRandomization.default, + BundlePrice.internal_name: BundlePrice.default, + EntranceRandomization.internal_name: EntranceRandomization.default, + SeasonRandomization.internal_name: SeasonRandomization.option_disabled, + Cropsanity.internal_name: Cropsanity.option_disabled, + BackpackProgression.internal_name: BackpackProgression.option_vanilla, + ToolProgression.internal_name: ToolProgression.option_vanilla, + ElevatorProgression.internal_name: ElevatorProgression.option_vanilla, + SkillProgression.internal_name: SkillProgression.option_vanilla, + BuildingProgression.internal_name: BuildingProgression.option_vanilla, + FestivalLocations.internal_name: FestivalLocations.option_disabled, + ArcadeMachineLocations.internal_name: ArcadeMachineLocations.option_disabled, + SpecialOrderLocations.internal_name: SpecialOrderLocations.option_disabled, + HelpWantedLocations.internal_name: "none", + Fishsanity.internal_name: Fishsanity.option_none, + Museumsanity.internal_name: Museumsanity.option_none, + Friendsanity.internal_name: Friendsanity.option_none, + FriendsanityHeartSize.internal_name: FriendsanityHeartSize.default, + NumberOfMovementBuffs.internal_name: NumberOfMovementBuffs.default, + NumberOfLuckBuffs.internal_name: NumberOfLuckBuffs.default, + ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_true, + TrapItems.internal_name: TrapItems.default, + MultipleDaySleepEnabled.internal_name: MultipleDaySleepEnabled.default, + MultipleDaySleepCost.internal_name: MultipleDaySleepCost.default, + ExperienceMultiplier.internal_name: ExperienceMultiplier.default, + FriendshipMultiplier.internal_name: FriendshipMultiplier.default, + DebrisMultiplier.internal_name: DebrisMultiplier.default, + QuickStart.internal_name: QuickStart.default, + Gifting.internal_name: Gifting.default, + "death_link": DeathLink.default, +} + +allsanity_settings = { + "progression_balancing": ProgressionBalancing.default, + "accessibility": Accessibility.option_locations, + Goal.internal_name: Goal.default, + StartingMoney.internal_name: StartingMoney.default, + ProfitMargin.internal_name: ProfitMargin.default, + BundleRandomization.internal_name: BundleRandomization.default, + BundlePrice.internal_name: BundlePrice.default, + EntranceRandomization.internal_name: EntranceRandomization.option_buildings, + SeasonRandomization.internal_name: SeasonRandomization.option_randomized, + Cropsanity.internal_name: Cropsanity.option_enabled, + BackpackProgression.internal_name: BackpackProgression.option_early_progressive, + ToolProgression.internal_name: ToolProgression.option_progressive, + ElevatorProgression.internal_name: ElevatorProgression.option_progressive, + SkillProgression.internal_name: SkillProgression.option_progressive, + BuildingProgression.internal_name: BuildingProgression.option_progressive_early_shipping_bin, + FestivalLocations.internal_name: FestivalLocations.option_hard, + ArcadeMachineLocations.internal_name: ArcadeMachineLocations.option_full_shuffling, + SpecialOrderLocations.internal_name: SpecialOrderLocations.option_board_qi, + HelpWantedLocations.internal_name: "maximum", + Fishsanity.internal_name: Fishsanity.option_all, + Museumsanity.internal_name: Museumsanity.option_all, + Friendsanity.internal_name: Friendsanity.option_all, + FriendsanityHeartSize.internal_name: 1, + NumberOfMovementBuffs.internal_name: 12, + NumberOfLuckBuffs.internal_name: 12, + ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_false, + TrapItems.internal_name: TrapItems.default, + MultipleDaySleepEnabled.internal_name: MultipleDaySleepEnabled.default, + MultipleDaySleepCost.internal_name: MultipleDaySleepCost.default, + ExperienceMultiplier.internal_name: ExperienceMultiplier.default, + FriendshipMultiplier.internal_name: FriendshipMultiplier.default, + DebrisMultiplier.internal_name: DebrisMultiplier.default, + QuickStart.internal_name: QuickStart.default, + Gifting.internal_name: Gifting.default, + "death_link": DeathLink.default, +} + +sv_options_presets: Dict[str, Dict[str, Any]] = { + "All random": all_random_settings, + "Easy": easy_settings, + "Medium": medium_settings, + "Hard": hard_settings, + "Nightmare": nightmare_settings, + "Short": short_settings, + "Lowsanity": lowsanity_settings, + "Allsanity": allsanity_settings, +} diff --git a/worlds/stardew_valley/test/TestRules.py b/worlds/stardew_valley/test/TestRules.py index 72337812..0749b1a8 100644 --- a/worlds/stardew_valley/test/TestRules.py +++ b/worlds/stardew_valley/test/TestRules.py @@ -329,7 +329,7 @@ class TestRecipeLogic(SVTestBase): options = { options.BuildingProgression.internal_name: options.BuildingProgression.option_progressive, options.SkillProgression.internal_name: options.SkillProgression.option_progressive, - options.Cropsanity.internal_name: options.Cropsanity.option_shuffled, + options.Cropsanity.internal_name: options.Cropsanity.option_enabled, } # I wanted to make a test for different ways to obtain a pizza, but I'm stuck not knowing how to block the immediate purchase from Gus diff --git a/worlds/stardew_valley/test/__init__.py b/worlds/stardew_valley/test/__init__.py index b0c4ba2c..ba037f7a 100644 --- a/worlds/stardew_valley/test/__init__.py +++ b/worlds/stardew_valley/test/__init__.py @@ -47,7 +47,7 @@ class SVTestBase(WorldTestBase, SVTestCase): def minimal_locations_maximal_items(): min_max_options = { SeasonRandomization.internal_name: SeasonRandomization.option_randomized, - Cropsanity.internal_name: Cropsanity.option_shuffled, + Cropsanity.internal_name: Cropsanity.option_enabled, BackpackProgression.internal_name: BackpackProgression.option_vanilla, ToolProgression.internal_name: ToolProgression.option_vanilla, SkillProgression.internal_name: SkillProgression.option_vanilla, @@ -72,7 +72,7 @@ def allsanity_options_without_mods(): BundleRandomization.internal_name: BundleRandomization.option_shuffled, BundlePrice.internal_name: BundlePrice.option_expensive, SeasonRandomization.internal_name: SeasonRandomization.option_randomized, - Cropsanity.internal_name: Cropsanity.option_shuffled, + Cropsanity.internal_name: Cropsanity.option_enabled, BackpackProgression.internal_name: BackpackProgression.option_progressive, ToolProgression.internal_name: ToolProgression.option_progressive, SkillProgression.internal_name: SkillProgression.option_progressive, diff --git a/worlds/stardew_valley/test/checks/option_checks.py b/worlds/stardew_valley/test/checks/option_checks.py index ce8e5524..c9d9860c 100644 --- a/worlds/stardew_valley/test/checks/option_checks.py +++ b/worlds/stardew_valley/test/checks/option_checks.py @@ -40,7 +40,7 @@ def assert_can_reach_island_if_should(tester: SVTestBase, multiworld: MultiWorld def assert_cropsanity_same_number_items_and_locations(tester: SVTestBase, multiworld: MultiWorld): - is_cropsanity = get_stardew_options(multiworld).cropsanity.value == options.Cropsanity.option_shuffled + is_cropsanity = get_stardew_options(multiworld).cropsanity.value == options.Cropsanity.option_enabled if not is_cropsanity: return