Stardew Valley: Add Options presets (#2470)

This commit is contained in:
agilbert1412 2023-11-18 13:35:57 -05:00 committed by GitHub
parent 790f192ded
commit e916b0d6b0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 405 additions and 84 deletions

View File

@ -11,6 +11,7 @@ from .locations import location_table, create_locations, LocationData
from .logic import StardewLogic, StardewRule, True_, MAX_MONTHS from .logic import StardewLogic, StardewRule, True_, MAX_MONTHS
from .options import StardewValleyOptions, SeasonRandomization, Goal, BundleRandomization, BundlePrice, NumberOfLuckBuffs, NumberOfMovementBuffs, \ from .options import StardewValleyOptions, SeasonRandomization, Goal, BundleRandomization, BundlePrice, NumberOfLuckBuffs, NumberOfMovementBuffs, \
BackpackProgression, BuildingProgression, ExcludeGingerIsland BackpackProgression, BuildingProgression, ExcludeGingerIsland
from .presets import sv_options_presets
from .regions import create_regions from .regions import create_regions
from .rules import set_rules from .rules import set_rules
from worlds.generic.Rules import set_rule from worlds.generic.Rules import set_rule
@ -34,6 +35,7 @@ class StardewItem(Item):
class StardewWebWorld(WebWorld): class StardewWebWorld(WebWorld):
theme = "dirt" theme = "dirt"
bug_report_page = "https://github.com/agilbert1412/StardewArchipelago/issues/new?labels=bug&title=%5BBug%5D%3A+Brief+Description+of+bug+here" 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 = [ tutorials = [
Tutorial( Tutorial(

View File

@ -1,7 +1,7 @@
id,name,classification,groups,mod_name id,name,classification,groups,mod_name
0,Joja Cola,filler,TRASH, 0,Joja Cola,filler,TRASH,
15,Rusty Key,progression,MUSEUM, 15,Rusty Key,progression,,
16,Dwarvish Translation Guide,progression,MUSEUM, 16,Dwarvish Translation Guide,progression,,
17,Bridge Repair,progression,COMMUNITY_REWARD, 17,Bridge Repair,progression,COMMUNITY_REWARD,
18,Greenhouse,progression,COMMUNITY_REWARD, 18,Greenhouse,progression,COMMUNITY_REWARD,
19,Glittering Boulder Removed,progression,COMMUNITY_REWARD, 19,Glittering Boulder Removed,progression,COMMUNITY_REWARD,

1 id name classification groups mod_name
2 0 Joja Cola filler TRASH
3 15 Rusty Key progression MUSEUM
4 16 Dwarvish Translation Guide progression MUSEUM
5 17 Bridge Repair progression COMMUNITY_REWARD
6 18 Greenhouse progression COMMUNITY_REWARD
7 19 Glittering Boulder Removed progression COMMUNITY_REWARD

View File

@ -300,15 +300,15 @@ def create_stardrops(item_factory: StardewItemFactory, options: StardewValleyOpt
def create_museum_items(item_factory: StardewItemFactory, options: StardewValleyOptions, items: List[Item]): 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("Rusty Key"))
items.append(item_factory("Dwarvish Translation Guide")) 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]): def create_friendsanity_items(item_factory: StardewItemFactory, options: StardewValleyOptions, items: List[Item]):

View File

@ -8,7 +8,7 @@ from .data import all_fish, FishItem, all_purchasable_seeds, SeedItem, all_crops
from .data.bundle_data import BundleItem from .data.bundle_data import BundleItem
from .data.crops_data import crops_by_name from .data.crops_data import crops_by_name
from .data.fish_data import island_fish 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, \ from .data.recipe_data import all_cooking_recipes, CookingRecipe, RecipeSource, FriendshipSource, QueenOfSauceSource, \
StarterSource, ShopSource, SkillSource StarterSource, ShopSource, SkillSource
from .data.villagers_data import all_villagers_by_name, Villager from .data.villagers_data import all_villagers_by_name, Villager
@ -1283,8 +1283,6 @@ class StardewLogic:
return self.has_lived_months(8) return self.has_lived_months(8)
def can_speak_dwarf(self) -> StardewRule: 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") return self.received("Dwarvish Translation Guide")
def can_donate_museum_item(self, item: MuseumItem) -> StardewRule: def can_donate_museum_item(self, item: MuseumItem) -> StardewRule:
@ -1370,9 +1368,6 @@ class StardewLogic:
return self.received("Month End", number) return self.received("Month End", number)
def has_rusty_key(self) -> StardewRule: 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) return self.received(Wallet.rusty_key)
def can_win_egg_hunt(self) -> StardewRule: def can_win_egg_hunt(self) -> StardewRule:

View File

@ -7,15 +7,15 @@ from .mods.mod_data import ModNames
class Goal(Choice): class Goal(Choice):
"""What's your goal with this play-through? """What's your goal with this play-through?
Community Center: The world will be completed once you complete the Community Center. Community Center: Complete the Community Center.
Grandpa's Evaluation: The world will be completed once 4 candles are lit at Grandpa's Shrine. Grandpa's Evaluation: Succeed grandpa's evaluation with 4 lit candles.
Bottom of the Mines: The world will be completed once you reach level 120 in the mineshaft. Bottom of the Mines: 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. Cryptic Note: 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. Master Angler: Catch 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. Complete Collection: Complete 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. Full House: Get married and have two children. Pairs well with Friendsanity.
Greatest Walnut Hunter: The world will be completed once you find all 130 Golden Walnuts Greatest Walnut Hunter: Find all 130 Golden Walnuts
Perfection: The world will be completed once you attain Perfection, based on the vanilla definition. Perfection: Attain Perfection, based on the vanilla definition.
""" """
internal_name = "goal" internal_name = "goal"
display_name = "Goal" display_name = "Goal"
@ -50,7 +50,7 @@ class Goal(Choice):
class StartingMoney(SpecialRange): class StartingMoney(SpecialRange):
"""Amount of gold when arriving at the farm. """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" internal_name = "starting_money"
display_name = "Starting Gold" display_name = "Starting Gold"
range_start = -1 range_start = -1
@ -117,10 +117,10 @@ class BundlePrice(Choice):
class EntranceRandomization(Choice): class EntranceRandomization(Choice):
"""Should area entrances be randomized? """Should area entrances be randomized?
Disabled: No entrance randomization is done Disabled: No entrance randomization is done
Pelican Town: Only buildings in the main town area are randomized among each other Pelican Town: Only doors in the main town area are randomized with each other
Non Progression: Only buildings that are always available 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 using a door are randomized with each other Buildings: All Entrances that Allow you to enter a building are randomized with each other
Chaos: Same as above, but the entrances get reshuffled every single day! Chaos: Same as "Buildings", but the entrances get reshuffled every single day!
""" """
# Everything: All buildings and areas are randomized with each other # 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! # 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): class SeasonRandomization(Choice):
"""Should seasons be randomized? """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: Start in Spring with all seasons unlocked.
Disabled: You will start in Spring with all seasons unlocked. Randomized: Start in a random season and the other 3 must be unlocked randomly.
Randomized: The seasons will be unlocked randomly as Archipelago items. Randomized Not Winter: Same as randomized, but the start season is guaranteed not to be winter.
Randomized Not Winter: The seasons are randomized, but you're guaranteed not to start with winter. Progressive: Start in Spring and unlock the seasons in their original order.
Progressive: You will start in Spring and unlock the seasons in their original order.
""" """
internal_name = "season_randomization" internal_name = "season_randomization"
display_name = "Season Randomization" display_name = "Season Randomization"
@ -163,20 +162,21 @@ class Cropsanity(Choice):
"""Formerly named "Seed Shuffle" """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. 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 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" internal_name = "cropsanity"
display_name = "Cropsanity" display_name = "Cropsanity"
default = 1 default = 1
option_disabled = 0 option_disabled = 0
option_shuffled = 1 option_enabled = 1
alias_shuffled = option_enabled
class BackpackProgression(Choice): class BackpackProgression(Choice):
"""How is the backpack progression handled? """Shuffle the backpack?
Vanilla: You can buy them at Pierre's General Store. Vanilla: You can buy backpacks at Pierre's General Store.
Progressive: You will randomly find Progressive Backpack upgrades. 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" internal_name = "backpack_progression"
display_name = "Backpack Progression" display_name = "Backpack Progression"
@ -187,8 +187,8 @@ class BackpackProgression(Choice):
class ToolProgression(Choice): class ToolProgression(Choice):
"""How is the tool progression handled? """Shuffle the tool upgrades?
Vanilla: Clint will upgrade your tools with ore. Vanilla: Clint will upgrade your tools with metal bars.
Progressive: You will randomly find Progressive Tool upgrades.""" Progressive: You will randomly find Progressive Tool upgrades."""
internal_name = "tool_progression" internal_name = "tool_progression"
display_name = "Tool Progression" display_name = "Tool Progression"
@ -198,12 +198,11 @@ class ToolProgression(Choice):
class ElevatorProgression(Choice): class ElevatorProgression(Choice):
"""How is Elevator progression handled? """Shuffle the elevator?
Vanilla: You will unlock new elevator floors for yourself. Vanilla: Reaching a mineshaft floor unlocks the elevator for it
Progressive: You will randomly find Progressive Mine Elevators to go deeper. Locations are sent for reaching Progressive: You will randomly find Progressive Mine Elevators to go deeper.
every elevator level. Progressive from previous floor: Same as progressive, but you cannot use the elevator to check elevator locations.
Progressive from previous floor: Same as progressive, but you must reach elevator floors on your own, You must reach elevator floors on your own."""
you cannot use the elevator to check elevator locations"""
internal_name = "elevator_progression" internal_name = "elevator_progression"
display_name = "Elevator Progression" display_name = "Elevator Progression"
default = 2 default = 2
@ -213,10 +212,9 @@ class ElevatorProgression(Choice):
class SkillProgression(Choice): class SkillProgression(Choice):
"""How is the skill progression handled? """Shuffle skill levels?
Vanilla: You will level up and get the normal reward at each level. Vanilla: Leveling up skills is normal
Progressive: The xp will be earned internally, locations will be sent when you earn a level. Your real Progressive: Skill levels are unlocked randomly, and earning xp sends checks"""
levels will be scattered around the multiworld."""
internal_name = "skill_progression" internal_name = "skill_progression"
display_name = "Skill Progression" display_name = "Skill Progression"
default = 1 default = 1
@ -225,11 +223,11 @@ class SkillProgression(Choice):
class BuildingProgression(Choice): class BuildingProgression(Choice):
"""How is the building progression handled? """Shuffle Carpenter Buildings?
Vanilla: You will buy each building normally. 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, 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. 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" internal_name = "building_progression"
display_name = "Building Progression" display_name = "Building Progression"
@ -240,10 +238,10 @@ class BuildingProgression(Choice):
class FestivalLocations(Choice): class FestivalLocations(Choice):
"""Locations for attending and participating in festivals """Shuffle Festival Activities?
With Disabled, you do not need to attend festivals Disabled: You do not need to attend festivals
With Easy, there are checks for participating in festivals Easy: Every festival has checks, but they are easy and usually only require attendance
With Hard, the festival checks are only granted when the player performs well in the festival Hard: Festivals have more checks, and many require performing well, not just attending
""" """
internal_name = "festival_locations" internal_name = "festival_locations"
display_name = "Festival Locations" display_name = "Festival Locations"
@ -254,11 +252,10 @@ class FestivalLocations(Choice):
class ArcadeMachineLocations(Choice): class ArcadeMachineLocations(Choice):
"""How are the Arcade Machines handled? """Shuffle the arcade machines?
Disabled: The arcade machines are not included in the Archipelago shuffling. Disabled: The arcade machines are not included.
Victories: Each Arcade Machine will contain one check on victory 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 Victories Easy: Same as Victories, but both games are made considerably easier.
player.
Full Shuffling: The arcade machines will contain multiple checks each, and different buffs that make the game 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. 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. 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): class SpecialOrderLocations(Choice):
"""How are the Special Orders handled? """Shuffle Special Orders?
Disabled: The special orders are not included in the Archipelago shuffling. 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 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" internal_name = "special_order_locations"
display_name = "Special Order Locations" display_name = "Special Order Locations"
@ -287,7 +284,7 @@ class SpecialOrderLocations(Choice):
class HelpWantedLocations(SpecialRange): 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. 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.""" Choosing a multiple of 7 is recommended."""
internal_name = "help_wanted_locations" internal_name = "help_wanted_locations"
@ -307,7 +304,7 @@ class HelpWantedLocations(SpecialRange):
class Fishsanity(Choice): class Fishsanity(Choice):
"""Locations for catching fish? """Locations for catching a fish the first time?
None: There are no locations for catching fish None: There are no locations for catching fish
Legendaries: Each of the 5 legendary fish are checks Legendaries: Each of the 5 legendary fish are checks
Special: A curated selection of strong 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 None: There are no locations for donating artifacts and minerals to the museum
Milestones: The donation milestones from the vanilla game are checks Milestones: The donation milestones from the vanilla game are checks
Randomized: A random selection of minerals and artifacts 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" internal_name = "museumsanity"
display_name = "Museumsanity" display_name = "Museumsanity"
@ -348,12 +345,12 @@ class Museumsanity(Choice):
class Friendsanity(Choice): class Friendsanity(Choice):
"""Locations for friendships? """Shuffle Friendships?
None: There are no checks for befriending villagers None: Friendship hearts are earned normally
Bachelors: Each heart of a bachelor is a check Bachelors: Hearts with bachelors are shuffled
Starting NPCs: Each heart for npcs that are immediately available is a check Starting NPCs: Hearts for NPCs available immediately are checks
All: Every heart with every NPC is a check, including Leo, Kent, Sandy, etc All: Hearts for all npcs are checks, including Leo, Kent, Sandy, etc
All With Marriage: Marriage candidates must also be dated, married, and befriended up to 14 hearts. All With Marriage: Hearts for all npcs are checks, including romance hearts up to 14 when applicable
""" """
internal_name = "friendsanity" internal_name = "friendsanity"
display_name = "Friendsanity" display_name = "Friendsanity"
@ -368,7 +365,7 @@ class Friendsanity(Choice):
# Conditional Setting - Friendsanity not None # Conditional Setting - Friendsanity not None
class FriendsanityHeartSize(Range): 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""" A higher value will lead to fewer heart items in the item pool, reducing bloat"""
internal_name = "friendsanity_heart_size" internal_name = "friendsanity_heart_size"
display_name = "Friendsanity Heart Size" display_name = "Friendsanity Heart Size"
@ -411,6 +408,7 @@ class ExcludeGingerIsland(Toggle):
class TrapItems(Choice): class TrapItems(Choice):
"""When rolling filler items, including resource packs, the game can also roll trap items. """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. 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" internal_name = "trap_items"
@ -441,14 +439,16 @@ class MultipleDaySleepCost(SpecialRange):
special_range_names = { special_range_names = {
"free": 0, "free": 0,
"cheap": 25, "cheap": 10,
"medium": 50, "medium": 25,
"expensive": 100, "expensive": 50,
"very expensive": 100,
} }
class ExperienceMultiplier(SpecialRange): 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.""" A higher setting means more experience."""
internal_name = "experience_multiplier" internal_name = "experience_multiplier"
display_name = "Experience Multiplier" display_name = "Experience Multiplier"
@ -513,14 +513,15 @@ class QuickStart(Toggle):
class Gifting(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" internal_name = "gifting"
display_name = "Gifting" display_name = "Gifting"
default = 1 default = 1
class Mods(OptionSet): 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" internal_name = "mods"
display_name = "Mods" display_name = "Mods"
valid_keys = { valid_keys = {

View File

@ -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,
}

View File

@ -329,7 +329,7 @@ class TestRecipeLogic(SVTestBase):
options = { options = {
options.BuildingProgression.internal_name: options.BuildingProgression.option_progressive, options.BuildingProgression.internal_name: options.BuildingProgression.option_progressive,
options.SkillProgression.internal_name: options.SkillProgression.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 # 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

View File

@ -47,7 +47,7 @@ class SVTestBase(WorldTestBase, SVTestCase):
def minimal_locations_maximal_items(): def minimal_locations_maximal_items():
min_max_options = { min_max_options = {
SeasonRandomization.internal_name: SeasonRandomization.option_randomized, SeasonRandomization.internal_name: SeasonRandomization.option_randomized,
Cropsanity.internal_name: Cropsanity.option_shuffled, Cropsanity.internal_name: Cropsanity.option_enabled,
BackpackProgression.internal_name: BackpackProgression.option_vanilla, BackpackProgression.internal_name: BackpackProgression.option_vanilla,
ToolProgression.internal_name: ToolProgression.option_vanilla, ToolProgression.internal_name: ToolProgression.option_vanilla,
SkillProgression.internal_name: SkillProgression.option_vanilla, SkillProgression.internal_name: SkillProgression.option_vanilla,
@ -72,7 +72,7 @@ def allsanity_options_without_mods():
BundleRandomization.internal_name: BundleRandomization.option_shuffled, BundleRandomization.internal_name: BundleRandomization.option_shuffled,
BundlePrice.internal_name: BundlePrice.option_expensive, BundlePrice.internal_name: BundlePrice.option_expensive,
SeasonRandomization.internal_name: SeasonRandomization.option_randomized, SeasonRandomization.internal_name: SeasonRandomization.option_randomized,
Cropsanity.internal_name: Cropsanity.option_shuffled, Cropsanity.internal_name: Cropsanity.option_enabled,
BackpackProgression.internal_name: BackpackProgression.option_progressive, BackpackProgression.internal_name: BackpackProgression.option_progressive,
ToolProgression.internal_name: ToolProgression.option_progressive, ToolProgression.internal_name: ToolProgression.option_progressive,
SkillProgression.internal_name: SkillProgression.option_progressive, SkillProgression.internal_name: SkillProgression.option_progressive,

View File

@ -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): 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: if not is_cropsanity:
return return