diff --git a/Removed yamls/DLCPlayer.yaml b/Removed yamls/DLCPlayer.yaml new file mode 100644 index 00000000000..39cf505dbe1 --- /dev/null +++ b/Removed yamls/DLCPlayer.yaml @@ -0,0 +1,14 @@ +DLCQuest: + progression_balancing: random + accessibility: random + double_jump_glitch: random + coinsanity: random + coinbundlequantity: random + time_is_money: random + ending_choice: random + campaign: random + item_shuffle: random + death_link: random +description: 'Generated by https://archipelago.gg/ for DLCQuest' +game: DLCQuest +name: DLCPlayer diff --git a/Removed yamls/DragorrodSV.yaml b/Removed yamls/DragorrodSV.yaml new file mode 100644 index 00000000000..b65e5cceec0 --- /dev/null +++ b/Removed yamls/DragorrodSV.yaml @@ -0,0 +1,528 @@ + +name: DragorrodSV + +game: Stardew Valley +requires: + version: 0.4.2 # Version of Archipelago required for this yaml to work as expected. + +Stardew Valley: + progression_balancing: 10 + accessibility: items + + + plando_items: + - items: + Beach Bridge: 1 + Amaranth Seeds: 1 + Corn Seeds: 1 + Desert Obelisk: 1 + Fishing Level: 7 + Galaxy Dagger: 1 + Galaxy Hammer: 1 + Galaxy Sword: 1 + Greenhouse: 1 + Haley <3: 3 + Harvey <3: 3 + Elliott <3: 3 + Emily <3: 3 + Alex <3: 3 + Island Farmhouse: 1 + Island North Turtle: 1 + Island West Turtle: 1 + Kale Seeds: 1 + Luck Level: 5 + Maru <3: 3 + Melon Seeds: 1 + Minecarts Repair: 1 + Movement Speed Bonus: 5 + Parrot Express: 1 + Penny <3: 3 + Progressive Barn: 3 + Progressive Coop: 3 + Progressive Fishing Rod: 2 + Progressive House: 3 + Red Cabbage Seeds: 1 + Return Scepter: 1 + Rusty Key: 1 + Sebastian <3: 3 + Seed Maker: 1 + Shane <3: 3 + Silo: 1 + Skull Key: 1 + Stardrop: 2 + Starfruit Seeds: 1 + Strawberry Seeds: 1 + Sunflower Seeds: 1 + The Queen of Sauce: 1 + Tomato Seeds: 1 + Tractor Garage: 1 + locations: + - 25,000g Bundle + - Catch A Squid + - Catch a Lingcod + - A Curious Substance + - Aquatic Overpopulation + - Biome Balance + - Cellar Blueprint + - Collect All Rarecrows + - Complete Fish Tank + - Crop Order + - Danger In The Deep + - Deluxe Barn Blueprint + - Deluxe Coop Blueprint + - Fair Stardrop + - "Fishsanity: Blobfish" + - "Fishsanity: Blue Discus" + - "Fishsanity: Glacierfish" + - "Fishsanity: Ice Pip" + - "Fishsanity: Lava Eel" + - "Fishsanity: Legend" + - "Fishsanity: Midnight Squid" + - "Fishsanity: Midnight Carp" + - "Fishsanity: Scorpion Carp" + - "Fishsanity: Spook Fish" + - "Fishsanity: Stingray" + - "Fishsanity: Void Salmon" + - Floor 120 Elevator + - Four Precious Stones + - Fragments of the past + - "Friendsanity: Abigail 14 <3" + - "Friendsanity: Alex 14 <3" + - "Friendsanity: Elliott 14 <3" + - "Friendsanity: Emily 14 <3" + - "Friendsanity: Haley 14 <3" + - "Friendsanity: Harvey 14 <3" + - "Friendsanity: Leah 14 <3" + - "Friendsanity: Maru 14 <3" + - "Friendsanity: Penny 14 <3" + - "Friendsanity: Sam 14 <3" + - "Friendsanity: Sebastian 14 <3" + - "Friendsanity: Shane 14 <3" + - Gifts for George + - Galaxy Sword Shrine + - Grange Display + - Harvest Banana + - Harvest Cactus Fruit + - Have Another Baby + - "Help Wanted: Fishing 5" + - "Help Wanted: Gathering 5" + - "Help Wanted: Item Delivery 20" + - "Help Wanted: Slay Monsters 5" + - Iridium Axe Upgrade + - Iridium Hoe Upgrade + - Iridium Pickaxe Upgrade + - Iridium Trash Can Upgrade + - Iridium Watering Can Upgrade + - Island Farmhouse + - Island Ingredients + - Island Mailbox + - Island Resort + - Island Trader + - Island West Turtle + - Juicy Bugs Wanted! + - Kids Room Blueprint + - Kitchen Blueprint + - Level 10 Binning + - Level 10 Cooking + - Level 10 Combat + - Level 10 Luck + - Level 10 Mining + - Level 10 Foraging + - Level 7 Archaeology + - Level 7 Combat + - Level 7 Cooking + - Level 7 Farming + - Level 7 Fishing + - Level 7 Foraging + - Level 7 Mining + - Level 7 Socializing + - Mayor's Need + - "Museumsanity: Golden Relic" + - "Museumsanity: Rare Disc" + - Night Fishing Bundle + - Pierre's Prime Produce + - Parrot Express + - Purchase Iridium Rod + - Qi's Challenge + - Qi's Crop + - Qi's Cuisine + - Qi's Kindness + - Qi's Prismatic Grange + - Quality Crops Bundle + - Repair Boat Anchor + - Repair Boat Hull + - Repair Ticket Machine + - Robin's Project + - Robin's Resource Rush + - Rock Rejuvenation + - Strange Note + - The Mines Floor 110 Treasure + - The Mysterious Qi + - The Strong Stuff + - Tractor Garage Blueprint + - Tropical Fish + - Volcano Bridge + - Volcano Caldera Treasure + - Volcano Exit Shortcut + - "Wanted: Lobster" + from_pool: true + world: NevaSV + force: true + percentage: 100 + + local_items: + # Forces these items to be in their native world. + [] + + non_local_items: + # Forces these items to be outside their native world. + [] + + start_inventory: + # Start with these items. + Farm Computer: 1 + Movement Speed Bonus: 2 + + start_hints: + # Start with these item's locations prefilled into the !hint command. + [] + + start_location_hints: + # Start with these locations and their item prefilled into the !hint command + [] + + exclude_locations: + # Prevent these locations from having an important item + [] + + priority_locations: + # Prevent these locations from having an unimportant item + [] + + item_links: + # Share part of your item pool with other players. + [] + + goal: + community_center: 50 + grandpa_evaluation: 0 + bottom_of_the_mines: 0 + cryptic_note: 0 + master_angler: 0 + complete_collection: 0 + full_house: 0 + greatest_walnut_hunter: 0 + perfection: 0 + + starting_money: 800 + + profit_margin: 125 + + bundle_randomization: + vanilla: 0 + thematic: 0 + shuffled: 50 + + bundle_price: + # How many items are needed for the community center bundles? + # Very Cheap: Every bundle will require 2 items fewer than usual + # Cheap: Every bundle will require 1 item fewer than usual + # Normal: Every bundle will require the vanilla number of items + # Expensive: Every bundle will require 1 extra item when applicable + very_cheap: 0 + cheap: 0 + normal: 0 + expensive: 50 + + entrance_randomization: + # 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! + disabled: 0 + pelican_town: 0 + non_progression: 0 + buildings: 50 + chaos: 0 + + season_randomization: + # 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: 0 + randomized: 50 + randomized_not_winter: 0 + progressive: 0 + + cropsanity: + # 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 + disabled: 0 + shuffled: 50 + + backpack_progression: + # How is the backpack progression handled? + # Vanilla: You can buy them at Pierre's General Store. + # Progressive: You will randomly find Progressive Backpack upgrades. + # Early Progressive: You can expect your first Backpack in sphere 1. + vanilla: 0 + progressive: 0 + early_progressive: 50 + + tool_progression: + # How is the tool progression handled? + # Vanilla: Clint will upgrade your tools with ore. + # Progressive: You will randomly find Progressive Tool upgrades. + vanilla: 0 + progressive: 50 + + skill_progression: + # 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. + vanilla: 0 + progressive: 50 + + building_progression: + # How is the building progression handled? + # Vanilla: You will 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. + vanilla: 0 + progressive: 0 + progressive_early_shipping_bin: 50 + + festival_locations: + # 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 + disabled: 0 + easy: 50 + hard: 0 + + elevator_progression: + # 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 + vanilla: 0 + progressive: 0 + progressive_from_previous_floor: 50 + + arcade_machine_locations: + # How are the Arcade Machines handled? + # Disabled: The arcade machines are not included in the Archipelago shuffling. + # 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. + # 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. + disabled: 50 + victories: 0 + victories_easy: 0 + full_shuffling: 0 + + special_order_locations: + # How are the Special Orders handled? + # 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 + disabled: 0 + board_only: 0 + board_qi: 50 + + help_wanted_locations: 40 + + fishsanity: + # Locations for catching fish? + # 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 + # Randomized: A random selection of fish are checks + # All: Every single fish in the game is a location that contains an item. Pairs well with the Master Angler Goal + # Exclude Legendaries: Every fish except legendaries + # Exclude Hard Fish: Every fish under difficulty 80 + # Only Easy Fish: Every fish under difficulty 50 + none: 0 + legendaries: 0 + special: 0 + randomized: 0 + all: 50 + exclude_legendaries: 0 + exclude_hard_fish: 0 + only_easy_fish: 0 + + museumsanity: + # Locations for museum donations? + # 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 + none: 0 + milestones: 0 + randomized: 0 + all: 50 + + friendsanity: + # 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. + none: 0 + bachelors: 0 + starting_npcs: 0 + all: 0 + all_with_marriage: 50 + + friendsanity_heart_size: + # If using friendsanity, how many hearts are received per 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 + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 1 + # Maximum value is 8 + 3: 50 + random: 0 + random-low: 0 + random-high: 0 + + movement_buff_number: + # Number of movement speed buffs to the player that exist as items in the pool. + # Each movement speed buff is a +25% multiplier that stacks additively + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 0 + # Maximum value is 12 + 10: 50 + random: 0 + random-low: 0 + random-high: 0 + + luck_buff_number: + # Number of luck buffs to the player that exist as items in the pool. + # Each luck buff is a bonus to daily luck of 0.025 + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 0 + # Maximum value is 12 + 10: 50 + random: 0 + random-low: 0 + random-high: 0 + + exclude_ginger_island: + # Exclude Ginger Island? + # This option will forcefully exclude everything related to Ginger Island from the slot. + # If you pick a goal that requires Ginger Island, you cannot exclude it and it will get included anyway + false: 50 + true: 0 + + trap_items: + # When rolling filler items, including resource packs, the game can also roll trap items. + # This setting is for choosing if traps will be in the item pool, and if so, how punishing they will be. + no_traps: 0 + easy: 0 + medium: 0 + hard: 0 + hell: 50 + nightmare: 0 + + multiple_day_sleep_enabled: + # Enable the ability to sleep automatically for multiple days straight? + false: 0 + true: 50 + + multiple_day_sleep_cost: + # How much gold it will cost to use MultiSleep. You will have to pay that amount for each day skipped. + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 0 + # Maximum value is 200 + random: 0 + random-low: 0 + random-high: 0 + free: 50 # equivalent to 0 + cheap: 0 # equivalent to 25 + medium: 0 # equivalent to 50 + expensive: 0 # equivalent to 100 + + experience_multiplier: + # How fast you want to earn skill experience. A lower setting mean less experience. + # A higher setting means more experience. + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 25 + # Maximum value is 800 + random: 0 + random-low: 0 + random-high: 0 + half: 0 # equivalent to 50 + vanilla: 0 # equivalent to 100 + double: 0 # equivalent to 200 + triple: 50 # equivalent to 300 + quadruple: 0 # equivalent to 400 + + friendship_multiplier: + # How fast you want to earn friendship points with villagers. + # A lower setting mean less friendship per action. + # A higher setting means more friendship per action. + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 25 + # Maximum value is 800 + random: 0 + random-low: 0 + random-high: 0 + half: 0 # equivalent to 50 + vanilla: 0 # equivalent to 100 + double: 0 # equivalent to 200 + triple: 50 # equivalent to 300 + quadruple: 0 # equivalent to 400 + + debris_multiplier: + # How much debris will spawn on the player's farm? + # Vanilla: debris spawns normally + # Half: debris will spawn at half the normal rate + # Quarter: debris will spawn at one quarter of the normal rate + # None: No debris will spawn on the farm, ever + # Start Clear: debris will spawn at the normal rate, but the farm will be completely clear when starting the game + vanilla: 0 + half: 50 + quarter: 0 + none: 0 + start_clear: 0 + + quick_start: + # Do you want the quick start package? You will get a few items to help early game automation, + # so you can use the multiple day sleep at its maximum. + false: 0 + true: 50 + + gifting: + # Do you want to enable gifting items to and from other Stardew Valley worlds? + false: 0 + true: 50 + + mods: + # List of mods that will be considered for shuffling. + ["Bigger Backpack", "Tractor Mod", "Luck Skill", "Archaeology", "Cooking Skill", "Binning Skill"] + + death_link: + # When you die, everyone dies. Of course the reverse is true too. + false: 50 + true: 0 diff --git a/Removed yamls/GiftReceiver.yaml b/Removed yamls/GiftReceiver.yaml new file mode 100644 index 00000000000..9b63c341a31 --- /dev/null +++ b/Removed yamls/GiftReceiver.yaml @@ -0,0 +1,41 @@ +Stardew Valley: + progression_balancing: 50 + accessibility: locations + goal: bottom_of_the_mines + starting_money: -1 + profit_margin: 200 + bundle_randomization: vanilla + bundle_price: very_cheap + entrance_randomization: disabled + season_randomization: disabled + cropsanity: disabled + backpack_progression: vanilla + tool_progression: vanilla + skill_progression: vanilla + building_progression: vanilla + festival_locations: disabled + elevator_progression: vanilla + arcade_machine_locations: disabled + special_order_locations: disabled + help_wanted_locations: 0 + fishsanity: none + museumsanity: none + friendsanity: none + friendsanity_heart_size: 4 + movement_buff_number: 4 + luck_buff_number: 4 + exclude_ginger_island: 'true' + trap_items: no_traps + multiple_day_sleep_enabled: 'true' + multiple_day_sleep_cost: 0 + experience_multiplier: 800 + friendship_multiplier: 800 + debris_multiplier: none + quick_start: 'true' + gifting: 'true' + death_link: 'false' + start_inventory: + {"Movement Speed Bonus": 4} +description: 'Generated by https://archipelago.gg/' +game: Stardew Valley +name: Receiver diff --git a/Removed yamls/GiftSender.yaml b/Removed yamls/GiftSender.yaml new file mode 100644 index 00000000000..c7105919df4 --- /dev/null +++ b/Removed yamls/GiftSender.yaml @@ -0,0 +1,41 @@ +Stardew Valley: + progression_balancing: 50 + accessibility: locations + goal: bottom_of_the_mines + starting_money: -1 + profit_margin: 200 + bundle_randomization: vanilla + bundle_price: very_cheap + entrance_randomization: disabled + season_randomization: disabled + cropsanity: disabled + backpack_progression: vanilla + tool_progression: vanilla + skill_progression: vanilla + building_progression: vanilla + festival_locations: disabled + elevator_progression: vanilla + arcade_machine_locations: disabled + special_order_locations: disabled + help_wanted_locations: 0 + fishsanity: none + museumsanity: none + friendsanity: none + friendsanity_heart_size: 4 + movement_buff_number: 4 + luck_buff_number: 4 + exclude_ginger_island: 'true' + trap_items: no_traps + multiple_day_sleep_enabled: 'true' + multiple_day_sleep_cost: 0 + experience_multiplier: 800 + friendship_multiplier: 800 + debris_multiplier: none + quick_start: 'true' + gifting: 'true' + death_link: 'false' + start_inventory: + {"Movement Speed Bonus": 4} +description: 'Generated by https://archipelago.gg/' +game: Stardew Valley +name: Sender diff --git a/Removed yamls/NevaSV.yaml b/Removed yamls/NevaSV.yaml new file mode 100644 index 00000000000..da096ae8b67 --- /dev/null +++ b/Removed yamls/NevaSV.yaml @@ -0,0 +1,527 @@ + +name: NevaSV + +game: Stardew Valley +requires: + version: 0.4.2 # Version of Archipelago required for this yaml to work as expected. + +Stardew Valley: + progression_balancing: 10 + accessibility: items + + plando_items: + - items: + Beach Bridge: 1 + Amaranth Seeds: 1 + Corn Seeds: 1 + Desert Obelisk: 1 + Fishing Level: 7 + Galaxy Dagger: 1 + Galaxy Hammer: 1 + Galaxy Sword: 1 + Greenhouse: 1 + Haley <3: 3 + Harvey <3: 3 + Elliott <3: 3 + Emily <3: 3 + Alex <3: 3 + Island Farmhouse: 1 + Island North Turtle: 1 + Island West Turtle: 1 + Kale Seeds: 1 + Luck Level: 5 + Maru <3: 3 + Melon Seeds: 1 + Minecarts Repair: 1 + Movement Speed Bonus: 5 + Parrot Express: 1 + Penny <3: 3 + Progressive Barn: 3 + Progressive Coop: 3 + Progressive Fishing Rod: 2 + Progressive House: 3 + Red Cabbage Seeds: 1 + Return Scepter: 1 + Rusty Key: 1 + Sebastian <3: 3 + Seed Maker: 1 + Shane <3: 3 + Silo: 1 + Skull Key: 1 + Stardrop: 2 + Starfruit Seeds: 1 + Strawberry Seeds: 1 + Sunflower Seeds: 1 + The Queen of Sauce: 1 + Tomato Seeds: 1 + Tractor Garage: 1 + locations: + - 25,000g Bundle + - Catch A Squid + - Catch a Lingcod + - A Curious Substance + - Aquatic Overpopulation + - Biome Balance + - Cellar Blueprint + - Collect All Rarecrows + - Complete Fish Tank + - Crop Order + - Danger In The Deep + - Deluxe Barn Blueprint + - Deluxe Coop Blueprint + - Fair Stardrop + - "Fishsanity: Blobfish" + - "Fishsanity: Blue Discus" + - "Fishsanity: Glacierfish" + - "Fishsanity: Ice Pip" + - "Fishsanity: Lava Eel" + - "Fishsanity: Legend" + - "Fishsanity: Midnight Squid" + - "Fishsanity: Midnight Carp" + - "Fishsanity: Scorpion Carp" + - "Fishsanity: Spook Fish" + - "Fishsanity: Stingray" + - "Fishsanity: Void Salmon" + - Floor 120 Elevator + - Four Precious Stones + - Fragments of the past + - "Friendsanity: Abigail 14 <3" + - "Friendsanity: Alex 14 <3" + - "Friendsanity: Elliott 14 <3" + - "Friendsanity: Emily 14 <3" + - "Friendsanity: Haley 14 <3" + - "Friendsanity: Harvey 14 <3" + - "Friendsanity: Leah 14 <3" + - "Friendsanity: Maru 14 <3" + - "Friendsanity: Penny 14 <3" + - "Friendsanity: Sam 14 <3" + - "Friendsanity: Sebastian 14 <3" + - "Friendsanity: Shane 14 <3" + - Gifts for George + - Galaxy Sword Shrine + - Grange Display + - Harvest Banana + - Harvest Cactus Fruit + - Have Another Baby + - "Help Wanted: Fishing 5" + - "Help Wanted: Gathering 5" + - "Help Wanted: Item Delivery 20" + - "Help Wanted: Slay Monsters 5" + - Iridium Axe Upgrade + - Iridium Hoe Upgrade + - Iridium Pickaxe Upgrade + - Iridium Trash Can Upgrade + - Iridium Watering Can Upgrade + - Island Farmhouse + - Island Ingredients + - Island Mailbox + - Island Resort + - Island Trader + - Island West Turtle + - Juicy Bugs Wanted! + - Kids Room Blueprint + - Kitchen Blueprint + - Level 10 Binning + - Level 10 Cooking + - Level 10 Combat + - Level 10 Luck + - Level 10 Mining + - Level 10 Foraging + - Level 7 Archaeology + - Level 7 Combat + - Level 7 Cooking + - Level 7 Farming + - Level 7 Fishing + - Level 7 Foraging + - Level 7 Mining + - Level 7 Socializing + - Mayor's Need + - "Museumsanity: Golden Relic" + - "Museumsanity: Rare Disc" + - Night Fishing Bundle + - Pierre's Prime Produce + - Parrot Express + - Purchase Iridium Rod + - Qi's Challenge + - Qi's Crop + - Qi's Cuisine + - Qi's Kindness + - Qi's Prismatic Grange + - Quality Crops Bundle + - Repair Boat Anchor + - Repair Boat Hull + - Repair Ticket Machine + - Robin's Project + - Robin's Resource Rush + - Rock Rejuvenation + - Strange Note + - The Mines Floor 110 Treasure + - The Mysterious Qi + - The Strong Stuff + - Tractor Garage Blueprint + - Tropical Fish + - Volcano Bridge + - Volcano Caldera Treasure + - Volcano Exit Shortcut + - "Wanted: Lobster" + from_pool: true + world: DragorrodSV + force: true + percentage: 100 + + local_items: + # Forces these items to be in their native world. + [] + + non_local_items: + # Forces these items to be outside their native world. + [] + + start_inventory: + # Start with these items. + Farm Computer: 1 + Movement Speed Bonus: 2 + + start_hints: + # Start with these item's locations prefilled into the !hint command. + [] + + start_location_hints: + # Start with these locations and their item prefilled into the !hint command + [] + + exclude_locations: + # Prevent these locations from having an important item + [] + + priority_locations: + # Prevent these locations from having an unimportant item + [] + + item_links: + # Share part of your item pool with other players. + [] + + goal: + community_center: 50 + grandpa_evaluation: 0 + bottom_of_the_mines: 0 + cryptic_note: 0 + master_angler: 0 + complete_collection: 0 + full_house: 0 + greatest_walnut_hunter: 0 + perfection: 0 + + starting_money: 800 + + profit_margin: 125 + + bundle_randomization: + vanilla: 0 + thematic: 0 + shuffled: 50 + + bundle_price: + # How many items are needed for the community center bundles? + # Very Cheap: Every bundle will require 2 items fewer than usual + # Cheap: Every bundle will require 1 item fewer than usual + # Normal: Every bundle will require the vanilla number of items + # Expensive: Every bundle will require 1 extra item when applicable + very_cheap: 0 + cheap: 0 + normal: 0 + expensive: 50 + + entrance_randomization: + # 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! + disabled: 50 + pelican_town: 0 + non_progression: 0 + buildings: 0 + chaos: 0 + + season_randomization: + # 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: 0 + randomized: 50 + randomized_not_winter: 0 + progressive: 0 + + cropsanity: + # 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 + disabled: 0 + shuffled: 50 + + backpack_progression: + # How is the backpack progression handled? + # Vanilla: You can buy them at Pierre's General Store. + # Progressive: You will randomly find Progressive Backpack upgrades. + # Early Progressive: You can expect your first Backpack in sphere 1. + vanilla: 0 + progressive: 0 + early_progressive: 50 + + tool_progression: + # How is the tool progression handled? + # Vanilla: Clint will upgrade your tools with ore. + # Progressive: You will randomly find Progressive Tool upgrades. + vanilla: 0 + progressive: 50 + + skill_progression: + # 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. + vanilla: 0 + progressive: 50 + + building_progression: + # How is the building progression handled? + # Vanilla: You will 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. + vanilla: 0 + progressive: 0 + progressive_early_shipping_bin: 50 + + festival_locations: + # 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 + disabled: 0 + easy: 50 + hard: 0 + + elevator_progression: + # 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 + vanilla: 0 + progressive: 0 + progressive_from_previous_floor: 50 + + arcade_machine_locations: + # How are the Arcade Machines handled? + # Disabled: The arcade machines are not included in the Archipelago shuffling. + # 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. + # 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. + disabled: 50 + victories: 0 + victories_easy: 0 + full_shuffling: 0 + + special_order_locations: + # How are the Special Orders handled? + # 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 + disabled: 0 + board_only: 0 + board_qi: 50 + + help_wanted_locations: 40 + + fishsanity: + # Locations for catching fish? + # 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 + # Randomized: A random selection of fish are checks + # All: Every single fish in the game is a location that contains an item. Pairs well with the Master Angler Goal + # Exclude Legendaries: Every fish except legendaries + # Exclude Hard Fish: Every fish under difficulty 80 + # Only Easy Fish: Every fish under difficulty 50 + none: 0 + legendaries: 0 + special: 0 + randomized: 0 + all: 50 + exclude_legendaries: 0 + exclude_hard_fish: 0 + only_easy_fish: 0 + + museumsanity: + # Locations for museum donations? + # 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 + none: 0 + milestones: 0 + randomized: 0 + all: 50 + + friendsanity: + # 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. + none: 0 + bachelors: 0 + starting_npcs: 0 + all: 0 + all_with_marriage: 50 + + friendsanity_heart_size: + # If using friendsanity, how many hearts are received per 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 + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 1 + # Maximum value is 8 + 3: 50 + random: 0 + random-low: 0 + random-high: 0 + + movement_buff_number: + # Number of movement speed buffs to the player that exist as items in the pool. + # Each movement speed buff is a +25% multiplier that stacks additively + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 0 + # Maximum value is 12 + 10: 50 + random: 0 + random-low: 0 + random-high: 0 + + luck_buff_number: + # Number of luck buffs to the player that exist as items in the pool. + # Each luck buff is a bonus to daily luck of 0.025 + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 0 + # Maximum value is 12 + 10: 50 + random: 0 + random-low: 0 + random-high: 0 + + exclude_ginger_island: + # Exclude Ginger Island? + # This option will forcefully exclude everything related to Ginger Island from the slot. + # If you pick a goal that requires Ginger Island, you cannot exclude it and it will get included anyway + false: 50 + true: 0 + + trap_items: + # When rolling filler items, including resource packs, the game can also roll trap items. + # This setting is for choosing if traps will be in the item pool, and if so, how punishing they will be. + no_traps: 0 + easy: 0 + medium: 0 + hard: 0 + hell: 50 + nightmare: 0 + + multiple_day_sleep_enabled: + # Enable the ability to sleep automatically for multiple days straight? + false: 0 + true: 50 + + multiple_day_sleep_cost: + # How much gold it will cost to use MultiSleep. You will have to pay that amount for each day skipped. + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 0 + # Maximum value is 200 + random: 0 + random-low: 0 + random-high: 0 + free: 50 # equivalent to 0 + cheap: 0 # equivalent to 25 + medium: 0 # equivalent to 50 + expensive: 0 # equivalent to 100 + + experience_multiplier: + # How fast you want to earn skill experience. A lower setting mean less experience. + # A higher setting means more experience. + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 25 + # Maximum value is 800 + random: 0 + random-low: 0 + random-high: 0 + half: 0 # equivalent to 50 + vanilla: 0 # equivalent to 100 + double: 0 # equivalent to 200 + triple: 50 # equivalent to 300 + quadruple: 0 # equivalent to 400 + + friendship_multiplier: + # How fast you want to earn friendship points with villagers. + # A lower setting mean less friendship per action. + # A higher setting means more friendship per action. + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 25 + # Maximum value is 800 + random: 0 + random-low: 0 + random-high: 0 + half: 0 # equivalent to 50 + vanilla: 0 # equivalent to 100 + double: 0 # equivalent to 200 + triple: 50 # equivalent to 300 + quadruple: 0 # equivalent to 400 + + debris_multiplier: + # How much debris will spawn on the player's farm? + # Vanilla: debris spawns normally + # Half: debris will spawn at half the normal rate + # Quarter: debris will spawn at one quarter of the normal rate + # None: No debris will spawn on the farm, ever + # Start Clear: debris will spawn at the normal rate, but the farm will be completely clear when starting the game + vanilla: 0 + half: 50 + quarter: 0 + none: 0 + start_clear: 0 + + quick_start: + # Do you want the quick start package? You will get a few items to help early game automation, + # so you can use the multiple day sleep at its maximum. + false: 0 + true: 50 + + gifting: + # Do you want to enable gifting items to and from other Stardew Valley worlds? + false: 0 + true: 50 + + mods: + # List of mods that will be considered for shuffling. + ["Bigger Backpack", "Tractor Mod", "Luck Skill", "Archaeology", "Cooking Skill", "Binning Skill"] + + death_link: + # When you die, everyone dies. Of course the reverse is true too. + false: 50 + true: 0 diff --git a/Removed yamls/Plandow.yaml b/Removed yamls/Plandow.yaml new file mode 100644 index 00000000000..800a42ff596 --- /dev/null +++ b/Removed yamls/Plandow.yaml @@ -0,0 +1,87 @@ +description: 'Generated by https://archipelago.gg/ for Hollow Knight' +game: Hollow Knight +name: Missing_DLL +Hollow Knight: + progression_balancing: disabled + accessibility: locations + RandomizeDreamers: 'true' + RandomizeSkills: 'true' + RandomizeFocus: 'true' + RandomizeSwim: 'true' + RandomizeCharms: 'true' + RandomizeKeys: 'true' + RandomizeMaskShards: 'true' + RandomizeVesselFragments: 'true' + RandomizeCharmNotches: 'true' + RandomizePaleOre: 'true' + RandomizeGeoChests: 'true' + RandomizeJunkPitChests: 'true' + RandomizeRancidEggs: 'true' + RandomizeRelics: 'true' + RandomizeWhisperingRoots: 'true' + RandomizeBossEssence: 'true' + RandomizeGrubs: 'true' + RandomizeMimics: 'true' + RandomizeMaps: 'true' + RandomizeStags: 'true' + RandomizeLifebloodCocoons: 'true' + RandomizeGrimmkinFlames: 'true' + RandomizeJournalEntries: 'true' + RandomizeNail: 'true' + RandomizeGeoRocks: 'true' + RandomizeBossGeo: 'true' + RandomizeSoulTotems: 'true' + RandomizeLoreTablets: 'true' + RandomizeElevatorPass: 'true' + PreciseMovement: 'true' + ProficientCombat: 'true' + BackgroundObjectPogos: 'true' + EnemyPogos: 'true' + ObscureSkips: 'false' + ShadeSkips: 'true' + InfectionSkips: 'false' + FireballSkips: 'false' + SpikeTunnels: 'false' + AcidSkips: 'true' + DamageBoosts: 'true' + DangerousSkips: 'true' + DarkRooms: 'true' + ComplexSkips: 'false' + DifficultSkips: 'false' + RemoveSpellUpgrades: 'false' + StartLocation: king's_pass + Goal: radiance + WhitePalace: include + StartingGeo: random + DeathLink: off + MinimumGeoPrice: random + MaximumGeoPrice: random + MinimumGrubPrice: random + MaximumGrubPrice: random + MinimumEssencePrice: random + MaximumEssencePrice: random + MinimumCharmPrice: random + MaximumCharmPrice: random + RandomCharmCosts: -2 + MinimumEggPrice: random + MaximumEggPrice: random + EggShopSlots: 7 + SlyShopSlots: 5 + SlyKeyShopSlots: 7 + IseldaShopSlots: 5 + SalubraShopSlots: 6 + SalubraCharmShopSlots: 5 + LegEaterShopSlots: 5 + GrubfatherRewardSlots: 7 + SeerRewardSlots: 5 + ExtraShopSlots: random + SplitCrystalHeart: 'true' + SplitMothwingCloak: 'true' + SplitMantisClaw: 'true' + CostSanity: on + CostSanityHybridChance: 2 + CostSanityEggWeight: 1 + CostSanityGrubWeight: 10 + CostSanityEssenceWeight: 10 + CostSanityCharmWeight: 10 + CostSanityGeoWeight: 8 \ No newline at end of file diff --git a/Removed yamls/RC1/CaitSith2-ALttP_-_Copy.yaml b/Removed yamls/RC1/CaitSith2-ALttP_-_Copy.yaml new file mode 100644 index 00000000000..2e1094560bf --- /dev/null +++ b/Removed yamls/RC1/CaitSith2-ALttP_-_Copy.yaml @@ -0,0 +1,670 @@ +############################################################################################################# +# # +# ▄████▄ ▄▄▄ ██▓▄▄▄█████▓ ██████ ██▓▄▄▄█████▓ ██░ ██ ▄▄▄█████▓ █ █░ ▒█████ # +# ▒██▀ ▀█ ▒████▄ ▓██▒▓ ██▒ ▓▒▒██ ▒ ▓██▒▓ ██▒ ▓▒▓██░ ██▒ ▓ ██▒ ▓▒▓█░ █ ░█░▒██▒ ██▒ # +# ▒▓█ ▄ ▒██ ▀█▄ ▒██▒▒ ▓██░ ▒░░ ▓██▄ ▒██▒▒ ▓██░ ▒░▒██▀▀██░ ▒ ▓██░ ▒░▒█░ █ ░█ ▒██░ ██▒ # +# ▒▓▓▄ ▄██▒░██▄▄▄▄██ ░██░░ ▓██▓ ░ ▒ ██▒░██░░ ▓██▓ ░ ░▓█ ░██ ░ ▓██▓ ░ ░█░ █ ░█ ▒██ ██░ # +# ▒ ▓███▀ ░ ▓█ ▓██▒░██░ ▒██▒ ░ ▒██████▒▒░██░ ▒██▒ ░ ░▓█▒░██▓ ▒██▒ ░ ░░██▒██▓ ░ ████▓▒░ # +# ░ ░▒ ▒ ░ ▒▒ ▓▒█░░▓ ▒ ░░ ▒ ▒▓▒ ▒ ░░▓ ▒ ░░ ▒ ░░▒░▒ ▒ ░░ ░ ▓░▒ ▒ ░ ▒░▒░▒░ # +# ░ ▒ ▒ ▒▒ ░ ▒ ░ ░ ░ ░▒ ░ ░ ▒ ░ ░ ▒ ░▒░ ░ ░ ▒ ░ ░ ░ ▒ ▒░ # +# ░ ░ ▒ ▒ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░░ ░ ░ ░ ░ ░ ░ ░ ▒ # +# ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ # +# ░ # +# # +# @ # +# @@@@@ ,@@@@@@ # +# @@@@&@@@ ,@@@&@@@@ # +# %@@@@&&@@@ @@@&&&@@@& # +# @@@@&&&@@@ ,@@@&&&@@@@ # +# @@@@&&&&&@@@ @@@&&&&&@@@@ # +# @@@@&&%&&@@@ @@@@@@@@@@@@@@@@@@@@@& @@@@&&%&&&@@@ # +# @@@@&&%%&&&@@@ @@@@@@@@@@################%@@@@@@@@% @@@&&&%&&&@@@@ # +# @@@@&&&%%&&@@@/ (@@@@@@################################&@@@@@@ @@@&&&%%&&&@@@@ # +# @@@&&&&%%&&&@@@,@@@@@@#########################################%@@@@@ @@@&&&&%&&&&&@@@ # +# @@@&&&&&%%&&&&@@@@@@@################################################&@@@@@@@&&&&%&&&&&&@@@ # +# @@@&&&&&&%&&&&&@@@@@&#####################################################%@/.,&&&&&%&&&&&&&@@% # +# @@@&&&&&&&&&&&&&@@@###########################################################@#../&&&&&&&&&&&@@. # +# @@@&&&&&%%%&&&&&&@######* #####################################################@#...@%&&&&&&@@@ # +# @@@&&&&&&&&&&&&&#########* /###################. (####################@##@%*#@@#(#&@/.../@@&@@@ # +# @@&&&&&&&&&&&###########. ,###############/ ,##################@@@@**/**/@##&..%@&@/.....*@ # +# @@@&&&&&&&&%####. ,/###(/, #* .(####@@#****@###&&@/...,//.., # +# (@@@&&&&&#####* ######&@#####&&&&@@@..*, # +# @@@&&&######. /@@@@@@@@@@@@@/ &@@@@@@@@@@@@% (##########&@@@@@, # +# @@@&######. ,@@@@@%%%%%%%%%&@@@@@ /@@@@@%%%%%%%%%@@@@@& .########&@@@.@.@ # +# @@@#######( %%((%%%&&%%%%%%# @@% @@#.%%%%%%&&&%%#(#%, ########@@@. /@ # +# @@@@######( #(((&&&&&&%%% @ */ *%%%&&&&&(((#. #######@@@@ # +# @@@@###### ((/((#/%%/((((* ((((##%#/#(((( ######@@@@ # +# @@@@##### /((((((((((. ((((((((((( #####&@@@@ # +# @@@@@#### .#####@@@@ # +# @@@@&###. /@ .@#@& ,@ #####@@@@@ # +# @@@@@###. (((((% #####@@@@@ # +# @@@@@#### (%&. #####%@@@@ # +# %@@@@@%### .#####@@@@@ # +# @@@@@@@####(. .####%@@@@@@ # +# @@@@@@@@@&#################/*.... ....,/########%@@@@@@@@@ # +# @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ # +# @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ # +# # +############################################################################################################# + +description: CaitSith2's ALttP YAML 1 of 1 +name: +# CaitSith {NUMBER}: 1 +# Yunica Tovah {NUMBER}: 1 +# Adol Christin {NUMBER}: 1 + Untitled Goose {NUMBER}: 1 +# Boco {NUMBER}: 1 +# Popoi {NUMBER}: 1 +game: + A Link to the Past: 1 +requires: + version: 0.2.3 + plando: bosses +# Shared Options supported by all games: +accessibility: + items: 0 + locations: 50 + none: 0 +progression_balancing: 50 +A Link to the Past: + start_hints: + - Swords + - Lamp + start_location_hints: + - 'Take-Any #1' + - 'Take-Any #2' + - 'Take-Any #3' + - 'Take-Any #4' + - 'Old Man Sword Cave' + start_inventory: + Rupees (300): 33 + Bombs (10): 1 + Arrows (10): 3 + Pegasus Boots: 1 + glitches_required: + none: 50 + minor_glitches: 0 + overworld_glitches: 0 + hybrid_major_glitches: 0 + no_logic: 0 + dark_room_logic: + lamp: 0 + torches: 1 + none: 0 + restrict_dungeon_item_on_boss: + on: 0 + off: 50 + bigkey_shuffle: + original_dungeon: 0 + own_dungeons: 1 + own_world: 0 + any_world: 0 + different_world: 0 + start_with: 0 + smallkey_shuffle: + original_dungeon: 0 + own_dungeons: 1 + own_world: 0 + any_world: 0 + different_world: 0 + universal: 0 + start_with: 0 + compass_shuffle: + original_dungeon: 0 + own_dungeons: 0 + own_world: 0 + any_world: 0 + different_world: 0 + start_with: 1 + map_shuffle: + original_dungeon: 0 + own_dungeons: 0 + own_world: 0 + any_world: 1 + different_world: 0 + start_with: 0 + key_drop_shuffle: + on: 1 + off: 0 + dungeon_counters: + on: 50 + pickup: 0 + default: 0 + off: 0 + progressive: + on: 50 + off: 0 + grouped_random: 0 + local_items: + - Swords + - Moon Pearl + - Lamp + - Bottles + - Flute + - Magic Mirror + - Gloves + - Hammer + - Hookshot + - Flippers + - Magic Powder + - Cane of Somaria + - Bombos + - Fire Rod + - Ice Rod + - Book of Mudora + - Shovel + - Mushroom + entrance_shuffle: + none: 0 + dungeonssimple: 0 + dungeonsfull: 0 + dungeonscrossed: 0 + dungeonscrossed-1000: 1 + simple: 0 + restricted: 0 + full: 0 + crossed: 0 + insanity: 0 + crossed-1000: 0 + crossed-group-myfriends: 0 + goals: + ganon: 0 + crystals: 0 + bosses: 1 + pedestal: 0 + ganon_pedestal: 0 + triforce_hunt: 0 + local_triforce_hunt: 0 + ganon_triforce_hunt: 0 + local_ganon_triforce_hunt: 0 + ice_rod_hunt: 0 + open_pyramid: + goal: 50 + auto: 0 + yes: 0 + no: 0 + triforce_pieces_mode: + extra: 0 + percentage: 0 + available: 50 + triforce_pieces_extra: + 0: 0 + 5: 50 + 10: 50 + 15: 0 + 20: 0 + triforce_pieces_percentage: + 100: 0 + 150: 50 + 200: 0 + triforce_pieces_available: + 25: 0 + 30: 0 + 40: 1 + 60: 0 + triforce_pieces_required: + 15: 0 + 20: 0 + 30: 1 + 40: 0 + 60: 0 + crystals_needed_for_gt: + 0: 50 + 7: 0 + random: 0 + random-low: 0 + random-middle: 0 + random-high: 0 + crystals_needed_for_ganon: + 0: 0 + 3: 0 + 4: 0 + 5: 50 + 6: 50 + 7: 50 + random: 0 + random-low: 0 + random-middle: 0 + random-high: 0 + mode: + standard: 0 + open: 50 + inverted: 0 + retro_bow: + on: 0 + off: 50 + retro_caves: + on: 1 + off: 0 + hints: + 'on': 1 + 'off': 0 + full: 0 + scams: + 'off': 1 + 'king_zora': 0 + 'bottle_merchant': 0 + 'all': 0 + swordless: + on: 0 + off: 1 + item_pool: + easy: 1 + normal: 0 + hard: 0 + expert: 0 + item_functionality: + easy: 50 + normal: 0 + hard: 0 + expert: 0 + tile_shuffle: + on: 50 + off: 0 + misery_mire_medallion: + random: 0 + Ether: 0 + Bombos: 1 + Quake: 0 + turtle_rock_medallion: + random: 0 + Ether: 0 + Bombos: 1 + Quake: 0 + boss_shuffle: + none: 0 + basic: 0 + full: 0 + chaos: 0 + + #I have no desire to fight Trinexx on Ice. The boss that is able to go into all locations is being placed there instead. + Ganons Tower Bottom-Kholdstare;Trinexx;Kholdstare: 1 + Ganons Tower Bottom-Moldorm;Trinexx;Moldorm: 1 + Ganons Tower Bottom-Mothula;Trinexx;Mothula: 1 + Ganons Tower Bottom-Helmasaur King;Trinexx;Helmasaur King: 1 + Ganons Tower Bottom-Vitreous;Trinexx;Vitreous: 1 + #And the rest of the singularity combinations the exclude trinexx entirely. + Armos Knights;Moldorm: 1 + Armos Knights;Helmasaur King: 0 + Armos Knights;Mothula: 1 + Armos Knights;Vitreous: 1 + Armos Knights;Kholdstare: 1 + Lanmolas;Moldorm: 1 + Lanmolas;Helmasaur King: 1 + Lanmolas;Mothula: 1 + Lanmolas;Vitreous: 1 + Lanmolas;Kholdstare: 1 + Arrghus;Moldorm: 1 + Arrghus;Helmasaur King: 1 + Arrghus;Mothula: 1 + Arrghus;Vitreous: 1 + Arrghus;Kholdstare: 1 + Blind;Moldorm: 1 + Blind;Helmasaur King: 1 + Blind;Mothula: 1 + Blind;Vitreous: 1 + Blind;Kholdstare: 1 + Moldorm: 1 + Helmasaur King: 1 + Mothula: 1 + Vitreous: 1 + Kholdstare: 1 + enemy_shuffle: + on: 0 + off: 50 + killable_thieves: + on: 1 + off: 0 + bush_shuffle: + on: 0 + off: 50 + enemy_damage: + default: 50 + shuffled: 0 + chaos: 0 + enemy_health: + default: 50 + easy: 0 + hard: 0 + expert: 0 + pot_shuffle: + 'on': 0 + 'off': 50 + beemizer_total_chance: + 0: 100 + 25: 0 + 50: 0 + 75: 0 + 100: 0 + beemizer_trap_chance: + 0: 100 + 60: 0 + 70: 0 + 80: 0 + 90: 0 + 100: 0 + shop_item_slots: + 0: 1 + 5: 0 + 15: 0 + 30: 0 + random: 0 + shop_price_modifier: + 0: 0 + 400: 0 + random: 0 + random-low: 0 + random-high: 0 + 100: 50 + shop_shuffle: + none: 0 + uw: 50 + g: 0 + f: 0 + i: 0 + p: 0 + w: 0 + ip: 0 + fpu: 0 + uip: 0 + shuffle_prizes: + none: 0 + g: 50 + b: 0 + bg: 0 + timer: + none: 50 + timed: 0 + timed_ohko: 0 + ohko: 0 + timed_countdown: 0 + display: 0 + countdown_start_time: + 0: 0 + 10: 50 + 20: 0 + 30: 0 + 60: 0 + red_clock_time: + -2: 50 + 1: 0 + blue_clock_time: + 1: 0 + 2: 50 + green_clock_time: + 4: 50 + 10: 0 + 15: 0 + glitch_boots: + on: 50 + off: 0 + random_sprite_on_event: + enabled: + on: 1 + off: 0 + on_hit: + on: 1 + off: 0 + on_enter: + on: 1 + off: 1 + on_exit: + on: 1 + off: 1 + on_slash: + on: 1 + off: 1 + on_item: + on: 1 + off: 1 + on_bonk: + on: 1 + off: 1 + on_everything: + on: 0 + off: 1 + use_weighted_sprite_pool: + on: 1 + off: 0 + sprite: + goose: 1 + boco: 1 + yunica tovah: 1 + adol: 1 + popoi: 1 + music: + on: 50 + off: 0 + quickswap: + on: 50 + off: 0 + triforcehud: + normal: 0 + hide_goal: 0 + hide_required: 0 + hide_both: 1 + reduceflashing: + on: 50 + off: 0 + menuspeed: + normal: 0 + instant: 0 + double: 0 + triple: 0 + quadruple: 1 + half: 0 + heartcolor: + red: 0 + blue: 1 + green: 0 + yellow: 0 + random: 0 + heartbeep: + double: 0 + normal: 0 + half: 0 + quarter: 1 + off: 0 + ow_palettes: + default: 50 + good: 0 + blackout: 0 + grayscale: 0 + negative: 0 + classic: 0 + dizzy: 0 + sick: 0 + puke: 0 + uw_palettes: + default: 50 + good: 0 + blackout: 0 + grayscale: 0 + negative: 0 + classic: 0 + dizzy: 0 + sick: 0 + puke: 0 + hud_palettes: + default: 50 + good: 0 + blackout: 0 + grayscale: 0 + negative: 0 + classic: 0 + dizzy: 0 + sick: 0 + puke: 0 + sword_palettes: + default: 50 + good: 0 + blackout: 0 + grayscale: 0 + negative: 0 + classic: 0 + dizzy: 0 + sick: 0 + puke: 0 + shield_palettes: + default: 50 + good: 0 + blackout: 0 + grayscale: 0 + negative: 0 + classic: 0 + dizzy: 0 + sick: 0 + puke: 0 + legacy_weapons: + trigger_disabled: 50 + randomized: 0 + assured: 0 + vanilla: 0 + swordless: 0 + death_link: + false: 50 + true: 0 + allow_collect: + false: 0 + true: 1 +linked_options: + - name: crosskeys + options: + A Link to the Past: + entrance_shuffle: crossed + bigkey_shuffle: true + compass_shuffle: true + map_shuffle: true + smallkey_shuffle: true + percentage: 0 + - name: localcrosskeys + options: + A Link to the Past: + entrance_shuffle: crossed + bigkey_shuffle: true + compass_shuffle: true + map_shuffle: true + smallkey_shuffle: true + local_items: + - "Small Keys" + - "Big Keys" + percentage: 0 + - name: enemizer + options: + A Link to the Past: + boss_shuffle: + basic: 1 + full: 1 + chaos: 1 + singularity: 1 + enemy_damage: + shuffled: 1 + chaos: 1 + enemy_health: + easy: 1 + hard: 1 + expert: 1 + percentage: 0 +triggers: + - option_name: legacy_weapons + option_result: randomized + option_category: A Link to the Past + options: + A Link to the Past: + swordless: off + - option_name: legacy_weapons + option_result: assured + option_category: A Link to the Past + options: + A Link to the Past: + swordless: off + start_inventory: + Progressive Sword: 1 + - option_name: legacy_weapons + option_result: vanilla + option_category: A Link to the Past + options: + A Link to the Past: + swordless: off + plando_items: + - items: + Progressive Sword: 4 + locations: + - Master Sword Pedestal + - Pyramid Fairy - Left + - Blacksmith + - Link's Uncle + - items: + Moon Pearl: 1 + Lamp: 1 + locations: + - early_locations + - option_name: legacy_weapons + option_result: swordless + option_category: A Link to the Past + options: + A Link to the Past: + swordless: on + - option_name: enemy_damage + option_category: A Link to the Past + option_result: shuffled + percentage: 0 + options: + A Link to the Past: + swordless: off + - option_name: name + option_result: Yunica Tovah {NUMBER} + option_category: null + options: + A Link to the Past: + sprite: + goose: 1 + boco: 1 + yunica tovah: 28 + adol: 1 + popoi: 1 + - option_name: name + option_result: Adol Christin {NUMBER} + option_category: null + options: + A Link to the Past: + sprite: + goose: 1 + boco: 1 + yunica tovah: 1 + adol: 28 + popoi: 1 + - option_name: name + option_result: Untitled Goose {NUMBER} + option_category: null + options: + A Link to the Past: + sprite: + goose: 28 + boco: 1 + yunica tovah: 1 + adol: 1 + popoi: 1 + - option_name: name + option_result: Boco {NUMBER} + option_category: null + options: + A Link to the Past: + sprite: + goose: 1 + boco: 28 + yunica tovah: 1 + adol: 1 + popoi: 1 + - option_name: name + option_result: Popoi {NUMBER} + option_category: null + options: + A Link to the Past: + sprite: + goose: 1 + boco: 1 + yunica tovah: 1 + adol: 1 + popoi: 28 + diff --git a/Removed yamls/RC1/DOOMBeta.yaml b/Removed yamls/RC1/DOOMBeta.yaml new file mode 100644 index 00000000000..f7414131bc1 --- /dev/null +++ b/Removed yamls/RC1/DOOMBeta.yaml @@ -0,0 +1,164 @@ +# Q. What is this file? +# A. This file contains options which allow you to configure your multiworld experience while allowing +# others to play how they want as well. +# +# Q. How do I use it? +# A. The options in this file are weighted. This means the higher number you assign to a value, the +# more chances you have for that option to be chosen. For example, an option like this: +# +# map_shuffle: +# on: 5 +# off: 15 +# +# Means you have 5 chances for map shuffle to occur, and 15 chances for map shuffle to be turned +# off. +# +# Q. I've never seen a file like this before. What characters am I allowed to use? +# A. This is a .yaml file. You are allowed to use most characters. +# To test if your yaml is valid or not, you can use this website: +# http://www.yamllint.com/ +# You can also verify your Archipelago settings are valid at this site: +# https://archipelago.gg/check + +# Your name in-game. Spaces will be replaced with underscores and there is a 16-character limit. +# {player} will be replaced with the player's slot number. +# {PLAYER} will be replaced with the player's slot number, if that slot number is greater than 1. +# {number} will be replaced with the counter value of the name. +# {NUMBER} will be replaced with the counter value of the name, if the counter value is greater than 1. +name: ForsakenDoom + +# Used to describe your yaml. Useful if you have multiple files. +description: Default DOOM 1993 Template + +game: DOOM 1993 +requires: + version: 0.4.2 # Version of Archipelago required for this yaml to work as expected. + +DOOM 1993: + progression_balancing: + # A system that can move progression earlier, to try and prevent the player from getting stuck and bored early. + # A lower setting means more getting stuck. A higher setting means less getting stuck. + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 0 + # Maximum value is 99 + random: 0 + random-low: 0 + random-high: 0 + disabled: 0 # equivalent to 0 + normal: 50 # equivalent to 50 + extreme: 0 # equivalent to 99 + + accessibility: + # Set rules for reachability of your items/locations. + # Locations: ensure everything can be reached and acquired. + # Items: ensure all logically relevant items can be acquired. + # Minimal: ensure what is needed to reach your goal can be acquired. + locations: 0 + items: 50 + minimal: 0 + + local_items: + # Forces these items to be in their native world. + [] + + non_local_items: + # Forces these items to be outside their native world. + [] + + start_inventory: + # Start with these items. + {} + + start_hints: + # Start with these item's locations prefilled into the !hint command. + [] + + start_location_hints: + # Start with these locations and their item prefilled into the !hint command + [] + + exclude_locations: + # Prevent these locations from having an important item + [] + + priority_locations: + # Prevent these locations from having an unimportant item + [] + + item_links: + # Share part of your item pool with other players. + [] + + difficulty: + # Choose the difficulty option. Those match DOOM's difficulty options. + # baby (I'm too young to die.) double ammos, half damage, less monsters or strength. + # easy (Hey, not too rough.) less monsters or strength. + # medium (Hurt me plenty.) Default. + # hard (Ultra-Violence.) More monsters or strength. + # nightmare (Nightmare!) Monsters attack more rapidly and respawn. + baby: 0 + easy: 50 + medium: 0 + hard: 0 + nightmare: 0 + + random_monsters: + # Choose how monsters are randomized. + # vanilla: No randomization + # shuffle: Monsters are shuffled within the level + # random_balanced: Monsters are completely randomized, but balanced based on existing ratio in the level. (Small monsters vs medium vs big) + vanilla: 50 + shuffle: 0 + random_balanced: 0 + + random_pickups: + # Choose how pickups are randomized. + # vanilla: No randomization + # shuffle: Pickups are shuffled within the level + # random_balanced: Pickups are completely randomized, but balanced based on existing ratio in the level. (Small pickups vs Big) + vanilla: 0 + shuffle: 50 + random_balanced: 0 + + allow_death_logic: + # Some locations require a timed puzzle that can only be tried once. + # After which, if the player failed to get it, the location cannot be checked anymore. + # By default, no progression items are placed here. There is a way, hovewer, to still get them: + # Get killed in the current map. The map will reset, you can now attempt the puzzle again. + false: 0 + true: 50 + + start_with_computer_area_maps: + # Give the player all Computer Area Map items from the start. + false: 0 + true: 50 + + death_link: + # When you die, everyone dies. Of course the reverse is true too. + false: 0 + true: 50 + + episode1: + # Knee-Deep in the Dead. + # If none of the episodes are chosen, Episode 1 will be chosen by default. + false: 0 + true: 50 + + episode2: + # The Shores of Hell. + # If none of the episodes are chosen, Episode 1 will be chosen by default. + false: 0 + true: 50 + + episode3: + # Inferno. + # If none of the episodes are chosen, Episode 1 will be chosen by default. + false: 50 + true: 0 + + episode4: + # Thy Flesh Consumed. + # If none of the episodes are chosen, Episode 1 will be chosen by default. + false: 50 + true: 0 diff --git a/Removed yamls/RC1/Dragus_DOOM_world.yaml b/Removed yamls/RC1/Dragus_DOOM_world.yaml new file mode 100644 index 00000000000..566b0b49c36 --- /dev/null +++ b/Removed yamls/RC1/Dragus_DOOM_world.yaml @@ -0,0 +1,53 @@ +DOOM 1993: + progression_balancing: 50 + accessibility: items + difficulty: medium + random_monsters: shuffle + random_pickups: shuffle + allow_death_logic: 'false' + start_with_computer_area_maps: 'false' + death_link: 'false' + episode1: 'false' + episode2: 'false' + episode3: 'true' + episode4: 'false' +description: 'Generated by https://archipelago.gg/ for DOOM 1993' +game: DOOM 1993 +name: Dragus DOOM + + +--- + +Super Mario World: + progression_balancing: 50 + accessibility: items + death_link: 'false' + goal: yoshi_egg_hunt + bosses_required: 7 + number_of_yoshi_eggs: 50 + percentage_of_yoshi_eggs: 70 + dragon_coin_checks: 'false' + bowser_castle_doors: fast + bowser_castle_rooms: random_two_room + level_shuffle: 'true' + exclude_special_zone: 'false' + boss_shuffle: full + swap_donut_gh_exits: 'false' + display_received_item_popups: progression + trap_fill_percentage: 0 + ice_trap_weight: medium + stun_trap_weight: medium + literature_trap_weight: medium + timer_trap_weight: medium + autosave: 'true' + early_climb: 'false' + overworld_speed: fast + music_shuffle: none + mario_palette: waluigi + foreground_palette_shuffle: 'true' + background_palette_shuffle: 'true' + overworld_palette_shuffle: 'true' + starting_life_count: random +description: 'Generated by https://archipelago.gg/ for Super Mario World' +game: Super Mario World +name: DragusSMW diff --git a/Removed yamls/RC1/Fatman_Main.yaml b/Removed yamls/RC1/Fatman_Main.yaml new file mode 100644 index 00000000000..acceef16749 --- /dev/null +++ b/Removed yamls/RC1/Fatman_Main.yaml @@ -0,0 +1,444 @@ +description: 'Me waiting for Silksong in AP (Its coming out this week I swear) :I' +name: Fatman +game: + Hollow Knight: 1 + Minecraft: 0 + Rogue Legacy: 0 + Super Mario 64: 0 + Factorio: 0 + Subnautica: 0 + Timespinner: 0 + The Witness: 0 +Hollow Knight: + RandomizeDreamers: + 'true': 25 + RandomizeSkills: + 'true': 25 + RandomizeFocus: + 'true': 25 + RandomizeSwim: + 'true': 25 + RandomizeElevatorPass: + 'true': 25 + RandomizeCharms: + 'true': 25 + RandomizeKeys: + 'true': 25 + RandomizeMaskShards: + 'true': 25 + RandomizeVesselFragments: + 'true': 25 + RandomizeCharmNotches: + 'true': 25 + RandomizePaleOre: + 'true': 25 + RandomizeGeoChests: + 'true': 25 + RandomizeJunkPitChests: + 'true': 25 + RandomizeRancidEggs: + 'true': 25 + RandomizeRelics: + 'true': 25 + RandomizeWhisperingRoots: + 'true': 25 + RandomizeBossEssence: + 'true': 25 + RandomizeGrubs: + 'true': 25 + RandomizeMimics: + 'true': 25 + RandomizeMaps: + 'true': 25 + RandomizeStags: + 'true': 25 + RandomizeLifebloodCocoons: + 'true': 25 + RandomizeGrimmkinFlames: + 'false': 25 + RandomizeJournalEntries: + 'true': 25 + RandomizeNail: + 'true': 25 + RandomizeGeoRocks: + 'false': 25 + RandomizeBossGeo: + 'true': 25 + RandomizeSoulTotems: + 'false': 25 + RandomizeLoreTablets: + 'false': 25 + PreciseMovement: + 'true': 25 + ProficientCombat: + 'true': 25 + BackgroundObjectPogos: + 'true': 25 + EnemyPogos: + 'true': 25 + ObscureSkips: + 'false': 25 + ShadeSkips: + 'false': 25 + InfectionSkips: + 'false': 25 + FireballSkips: + 'false': 25 + SpikeTunnels: + 'false': 25 + AcidSkips: + 'false': 25 + DamageBoosts: + 'false': 25 + DangerousSkips: + 'false': 25 + DarkRooms: + 'false': 25 + ComplexSkips: + 'false': 25 + DifficultSkips: + 'false': 25 + RemoveSpellUpgrades: + 'false': 25 + SplitCrystalHeart: + 'true': 25 + SplitMothwingCloak: + 'true': 25 + SplitMantisClaw: + 'true': 25 + StartLocation: + king's_pass: 25 + MinimumGrubPrice: + 5: 25 + MaximumGrubPrice: + 25: 25 + MinimumEssencePrice: + 400: 25 + MaximumEssencePrice: + 1600: 25 + MinimumEggPrice: + 3: 25 + MaximumEggPrice: + 10: 25 + MinimumCharmPrice: + 3: 25 + MaximumCharmPrice: + 20: 25 + MinimumGeoPrice: + 15: 1 + MaximumGeoPrice: + random-range-middle-200-750: 1 + RandomCharmCosts: + random-range-middle-60-110 + EggShopSlots: + random-range-middle-4-8 + SlyShopSlots: + random-range-middle-4-8 + SlyKeyShopSlots: + random-range-middle-6-10 + IseldaShopSlots: + random-range-middle-3-7 + SalubraShopSlots: + random-high: 1 + SalubraCharmShopSlots: + 1: 1 + LegEaterShopSlots: + random-range-middle-3-7: 1 + GrubfatherRewardSlots: + random-range-middle-3-10: 1 + SeerRewardSlots: + random: 1 + Goal: + radiance: 2 + hollowknight: 0 + WhitePalace: + include: 2 + kingfragment: 2 + DeathLink: + shade: 0 + off: 1 + progression_balancing: + 0: 1 + CostSanity: + true: 1 + CostSanityHybridChance: + random-range-low-3-20: 1 + CostSanityEggWeight: + random-range-low-15-30: 1 + CostSanityGrubWeight: + random-range-middle-35-65: 1 + CostSanityEssenceWeight: + random-range-middle-35-65: 1 + CostSanityCharmWeight: + random-range-low-15-30: 1 + CostSanityGeoWeight: + random-range-middle-100-160: 1 + accessibility: + items: 25 + priority_locations: [] + StartingGeo: + random-high: 1 + exclude_locations: ["Boss_Essence-Grey_Prince_Zote"] + local_items: ["Void_Heart", "Herrah"] + non_local_items: [] + start_hints: ["Monomon", "Lurien", "Queen_Fragment", "Upslash"] + start_location_hints: [] +Minecraft: + advancement_goal: + random-range-middle-45-55: 20 + egg_shards_required: + random-range-middle-15-20: 25 + egg_shards_available: + 30: 25 + required_bosses: + none: 25 + shuffle_structures: + 'true': 25 + structure_compasses: + 'false': 25 + bee_traps: + 15: 25 + combat_difficulty: + normal: 40 + include_hard_advancements: + 'false': 25 + include_unreasonable_advancements: + 'false': 25 + include_postgame_advancements: + 'false': 25 + send_defeated_mobs: + 'false': 25 + death_link: + 'false': 25 + progression_balancing: + 20: 1 + accessibility: + items: 25 + priority_locations: [] + start_inventory: {} + exclude_locations: + - "Caves & Cliffs" + - "Great View From Up Here" + local_items: [] + non_local_items: [] + start_hints: [] + start_location_hints: [] +Rogue Legacy: + starting_gender: random + starting_class: random + new_game_plus: normal + fairy_chests_per_zone: 5 + chests_per_zone: 18 + universal_fairy_chests: 'true' + universal_chests: 'false' + vendors: random + architect: normal + architect_fee: 70 + disable_charon: 'false' + require_purchasing: 'true' + progressive_blueprints: 'true' + gold_gain_multiplier: normal + number_of_children: 4 + free_diary_on_generation: 'true' + khidr: vanilla + alexander: vanilla + leon: vanilla + herodotus: vanilla + health_pool: 15 + mana_pool: 15 + attack_pool: 15 + magic_damage_pool: 15 + armor_pool: 10 + equip_pool: 10 + crit_chance_pool: 5 + crit_damage_pool: 5 + allow_default_names: 'true' + death_link: 'false' + progression_balancing: 35 + exclude_locations: + - Fairy Chest 7 + - Fairy Chest 8 + - Fairy Chest 9 + - Fairy Chest 10 + - Fairy Chest 11 + - Fairy Chest 12 + - Fairy Chest 13 + - Fairy Chest 14 + - Fairy Chest 15 + - Fairy Chest 16 + - Fairy Chest 17 + - Fairy Chest 18 + - Fairy Chest 19 + - Fairy Chest 20 + accessibility: items +Super Mario 64: + progression_balancing: 25 + accessibility: items + AreaRandomizer: courses_and_secrets + ProgressiveKeys: 'true' + EnableCoinStars: 'false' + AmountOfStars: 120 + StrictCapRequirements: 'true' + StrictCannonRequirements: 'true' + FirstBowserStarDoorCost: random-range-middle-6-15 + BasementStarDoorCost: random-range-middle-20-40 + SecondFloorStarDoorCost: random-range-middle-40-60 + MIPS1Cost: random-range-middle-10-20 + MIPS2Cost: 50 + StarsToFinish: 60 + death_link: 'false' + BuddyChecks: 'true' +Factorio: + accessibility: items + max_science_pack: production_science_pack + goal: rocket + tech_tree_layout: random + tech_cost: kind + silo: randomize_recipe + satellite: randomize_recipe + free_samples: single_craft + tech_tree_information: advancement + recipe_time: normal + recipe_ingredients: science_pack + imported_blueprints: 'true' + progressive: on + evolution_traps: 0 + attack_traps: 0 + evolution_trap_increase: 10 + starting_items: # Mapping of Factorio internal item-name to amount granted on start. + burner-mining-drill: 10 + stone-furnace: 10 + world_gen: # World Generation settings. Overview of options at https://wiki.factorio.com/Map_generator, + # with in-depth documentation at https://lua-api.factorio.com/latest/Concepts.html#MapGenSettings + autoplace_controls: + coal: + frequency: 1 + richness: 6 + size: 3 + copper-ore: + frequency: 1 + richness: 6 + size: 3 + crude-oil: + frequency: 1 + richness: 6 + size: 3 + enemy-base: + frequency: 1 + richness: 1 + size: 1 + iron-ore: + frequency: 1 + richness: 6 + size: 3 + stone: + frequency: 1 + richness: 6 + size: 3 + trees: + frequency: 1 + richness: 1 + size: 1 + uranium-ore: + frequency: 1 + richness: 6 + size: 3 + cliff_settings: + cliff_elevation_0: 10 + cliff_elevation_interval: 40 + name: cliff + richness: 1 + enemy_evolution: + destroy_factor: 0.002 + enabled: true + pollution_factor: 9.0e-07 + time_factor: 4.0e-06 + enemy_expansion: + enabled: true + max_expansion_cooldown: 216000 + max_expansion_distance: 7 + min_expansion_cooldown: 14400 + settler_group_max_size: 20 + settler_group_min_size: 5 + peaceful_mode: false + pollution: + ageing: 1 + diffusion_ratio: 0.02 + enabled: true + enemy_attack_pollution_consumption_modifier: 1 + min_pollution_to_damage_trees: 60 + pollution_restored_per_tree_damage: 10 + property_expression_names: + control-setting:aux:bias: 0 + control-setting:aux:frequency:multiplier: 1 + control-setting:moisture:bias: 0 + control-setting:moisture:frequency:multiplier: 1 + seed: null + starting_area: 1.5 + terrain_segmentation: 0.5 + water: 1.5 + progression_balancing: 30 + death_link: 'false' + energy_link: 'false' +Subnautica: + progression_balancing: 25 + accessibility: items + swim_rule: easy + early_seaglide: 'true' + item_pool: valuable + goal: infected + creature_scans: 15 + creature_scan_logic: either + death_link: 'false' + start_inventory: + Seamoth Fragment: 1 +Timespinner: + progression_balancing: 30 + accessibility: items + StartWithJewelryBox: 'true' + DownloadableItems: 'true' + EyeSpy: 'false' + StartWithMeyef: 'false' + QuickSeed: 'false' + SpecificKeycards: 'true' + Inverted: + random: 1 + GyreArchives: 'false' + Cantoran: 'true' + LoreChecks: 'true' + BossRando: 'true' + BossScaling: 'true' + DamageRando: balanced + HpCap: 999 + BossHealing: 'true' + ShopFill: randomized + ShopWarpShards: 'true' + ShopMultiplier: 1 + LootPool: randomized + DropRateCategory: tiered + FixedDropRate: 5 + LootTierDistro: default_weight + ShowBestiary: 'true' + ShowDrops: 'false' + EnterSandman: 'false' + DeathLink: 'false' +The Witness: + progression_balancing: 50 + accessibility: items + puzzle_randomization: sigma_normal + shuffle_symbols: 'true' + shuffle_doors: doors_complex + shuffle_lasers: 'true' + disable_non_randomized_puzzles: 'false' + shuffle_discarded_panels: 'true' + shuffle_vault_boxes: 'true' + shuffle_postgame: 'false' + victory_condition: mountain_box_short + mountain_lasers: 7 + challenge_lasers: 8 + early_secret_area: 'false' + trap_percentage: 25 + puzzle_skip_amount: 9 + hint_amount: 10 + death_link: 'true' + local_items: ["Lasers"] \ No newline at end of file diff --git a/Removed yamls/RC1/Figment-SDV-4xx-MA.yaml b/Removed yamls/RC1/Figment-SDV-4xx-MA.yaml new file mode 100644 index 00000000000..4e2c20801d9 --- /dev/null +++ b/Removed yamls/RC1/Figment-SDV-4xx-MA.yaml @@ -0,0 +1,190 @@ +description: NO FARM, ONLY FISH! +name: Figment{NUMBER} +game: Stardew Valley +requires: + version: 0.4.2 + plando: items +Stardew Valley: + progression_balancing: 50 + accessibility: items + goal: master_angler + starting_money: -1 + profit_margin: 400 + bundle_randomization: vanilla + bundle_price: very_cheap + entrance_randomization: disabled + season_randomization: randomized + cropsanity: disabled + backpack_progression: vanilla + tool_progression: progressive + skill_progression: progressive + building_progression: vanilla + festival_locations: disabled + elevator_progression: progressive + arcade_machine_locations: disabled + special_order_locations: disabled + help_wanted_locations: 0 + fishsanity: all + museumsanity: milestones + friendsanity: none + friendsanity_heart_size: 4 + movement_buff_number: 0 + luck_buff_number: 12 + exclude_ginger_island: true + trap_items: no_traps + multiple_day_sleep_enabled: true + multiple_day_sleep_cost: 0 + experience_multiplier: 800 + friendship_multiplier: 800 + debris_multiplier: start_clear + quick_start: true + gifting: true + mods: [] + death_link: false + start_inventory: {Return Scepter: 1} + exclude_locations: + - A Soldier's Star + - Animal Bundle + - Artisan Bundle + - Carving Pumpkins + - Chef's Bundle + - Complete Bulletin Board + - Complete Pantry + - Cow's Delight + - Crop Research + - Cryptic Note + - Dye Bundle + - Enchanter's Bundle + - Exotic Spirits + - Fall Crops Bundle + - Floor 105 Elevator + - Floor 110 Elevator + - Fresh Fruit + - Galaxy Sword Shrine + - Have Another Baby + - Have a Baby + - Iridium Axe Upgrade + - Iridium Hoe Upgrade + - Iridium Pickaxe Upgrade + - Iridium Trash Can Upgrade + - Iridium Watering Can Upgrade + - Jodi's Request + - Knee Therapy + - Magic Ink + - Mayor's "Shorts" + - Mayor's Need + - 'Museumsanity: 3 Artifacts' + - 'Museumsanity: 5 Donations' + - 'Museumsanity: 6 Artifacts' + - 'Museumsanity: 9 Artifacts' + - 'Museumsanity: 11 Artifacts' + - 'Museumsanity: 11 Minerals' + - 'Museumsanity: 15 Artifacts' + - 'Museumsanity: 15 Donations' + - 'Museumsanity: 20 Artifacts' + - Old Master Cannoli + - Pam Is Thirsty + - Pam Needs Juice + - Qi's Challenge + - Quality Crops Bundle + - Spring Crops Bundle + - Staff Of Power + - Strange Note + - Summer Crops Bundle + - The Mines Floor 110 Treasure + - The Mysterious Qi + plando_items: + # Skills + - items: + Combat Level: 10 + locations: + - Level 1 Combat + - Level 2 Combat + - Level 3 Combat + - Level 4 Combat + - Level 5 Combat + - Level 6 Combat + - Level 7 Combat + - Level 8 Combat + - Level 9 Combat + - Level 10 Combat + - items: + Farming Level: 10 + locations: + - Level 1 Farming + - Level 2 Farming + - Level 3 Farming + - Level 4 Farming + - Level 5 Farming + - Level 6 Farming + - Level 7 Farming + - Level 8 Farming + - Level 9 Farming + - Level 10 Farming + - items: + Foraging Level: 10 + locations: + - Level 1 Foraging + - Level 2 Foraging + - Level 3 Foraging + - Level 4 Foraging + - Level 5 Foraging + - Level 6 Foraging + - Level 7 Foraging + - Level 8 Foraging + - Level 9 Foraging + - Level 10 Foraging + - items: + Mining Level: 10 + locations: + - Level 1 Mining + - Level 2 Mining + - Level 3 Mining + - Level 4 Mining + - Level 5 Mining + - Level 6 Mining + - Level 7 Mining + - Level 8 Mining + - Level 9 Mining + - Level 10 Mining + # Vanilla Museum + - item: + Ancient Seeds Recipe: 1 + location: 'Museumsanity: Ancient Seed' + - item: + Dwarvish Translation Guide: 1 + location: 'Museumsanity: Dwarf Scrolls' + # Filler Museum + - items: + Ancient Seeds: 5 + Magic Rock Candy: 5 + Traveling Merchant Discount: 8 + locations: + - 'Museumsanity: 20 Donations' + - 'Museumsanity: 21 Minerals' + - 'Museumsanity: 25 Donations' + - 'Museumsanity: 30 Donations' + - 'Museumsanity: 31 Minerals' + - 'Museumsanity: 35 Donations' + - 'Museumsanity: 40 Donations' + - 'Museumsanity: 41 Minerals' + - 'Museumsanity: 50 Donations' + - 'Museumsanity: 50 Minerals' + - 'Museumsanity: 60 Donations' + - 'Museumsanity: 70 Donations' + - 'Museumsanity: 80 Donations' + - 'Museumsanity: 90 Donations' + - 'Museumsanity: 95 Donations' + - 'Museumsanity: Skeleton Back' + - 'Museumsanity: Skeleton Front' + - 'Museumsanity: Skeleton Middle' + # Mines + - item: + Rusty Sword: 1 + location: Floor 115 Elevator + - item: + Slingshot: 1 + location: Floor 120 Elevator + - item: + Master Slingshot: 1 + location: The Mines Floor 120 Treasure \ No newline at end of file diff --git a/Removed yamls/RC1/Forsaken_Terraria.yaml b/Removed yamls/RC1/Forsaken_Terraria.yaml new file mode 100644 index 00000000000..d86ba60d4ae --- /dev/null +++ b/Removed yamls/RC1/Forsaken_Terraria.yaml @@ -0,0 +1,120 @@ +# Q. What is this file? +# A. This file contains options which allow you to configure your multiworld experience while allowing +# others to play how they want as well. +# +# Q. How do I use it? +# A. The options in this file are weighted. This means the higher number you assign to a value, the +# more chances you have for that option to be chosen. For example, an option like this: +# +# map_shuffle: +# on: 5 +# off: 15 +# +# Means you have 5 chances for map shuffle to occur, and 15 chances for map shuffle to be turned +# off. +# +# Q. I've never seen a file like this before. What characters am I allowed to use? +# A. This is a .yaml file. You are allowed to use most characters. +# To test if your yaml is valid or not, you can use this website: +# http://www.yamllint.com/ +# You can also verify your Archipelago settings are valid at this site: +# https://archipelago.gg/check + +# Your name in-game. Spaces will be replaced with underscores and there is a 16-character limit. +# {player} will be replaced with the player's slot number. +# {PLAYER} will be replaced with the player's slot number, if that slot number is greater than 1. +# {number} will be replaced with the counter value of the name. +# {NUMBER} will be replaced with the counter value of the name, if the counter value is greater than 1. +name: Forsaken + +# Used to describe your yaml. Useful if you have multiple files. +description: Default Terraria Template + +game: Terraria +requires: + version: 0.4.2 # Version of Archipelago required for this yaml to work as expected. + +Terraria: + progression_balancing: + # A system that can move progression earlier, to try and prevent the player from getting stuck and bored early. + # A lower setting means more getting stuck. A higher setting means less getting stuck. + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 0 + # Maximum value is 99 + random: 0 + random-low: 0 + random-high: 0 + disabled: 0 # equivalent to 0 + normal: 50 # equivalent to 50 + extreme: 0 # equivalent to 99 + + accessibility: + # Set rules for reachability of your items/locations. + # Locations: ensure everything can be reached and acquired. + # Items: ensure all logically relevant items can be acquired. + # Minimal: ensure what is needed to reach your goal can be acquired. + locations: 0 + items: 50 + minimal: 0 + + local_items: + # Forces these items to be in their native world. + [] + + non_local_items: + # Forces these items to be outside their native world. + [] + + start_inventory: + # Start with these items. + {} + + start_hints: + # Start with these item's locations prefilled into the !hint command. + [] + + start_location_hints: + # Start with these locations and their item prefilled into the !hint command + [] + + exclude_locations: + # Prevent these locations from having an important item + [] + + priority_locations: + # Prevent these locations from having an unimportant item + [] + + item_links: + # Share part of your item pool with other players. + [] + + goal: + # The victory condition for your run. Stuff after the goal will not be shuffled. + mechanical_bosses: 0 + plantera: 0 + golem: 0 + empress_of_light: 0 + lunatic_cultist: 0 + moon_lord: 50 + zenith: 0 + + achievements: + # Adds checks upon collecting achievements. Achievements for clearing bosses and events are excluded. + # "Exclude Grindy" also excludes fishing achievements. + none: 50 + exclude_grindy: 0 + exclude_fishing: 0 + all: 0 + + fill_extra_checks_with: + # Applies if you have achievements enabled. "Useful Items" helps to make the early game less grindy. + # Items are rewarded to all players in your Terraria world. + coins: 0 + useful_items: 50 + + death_link: + # When you die, everyone dies. Of course the reverse is true too. + false: 50 + true: 0 diff --git a/Removed yamls/RC1/KenderUT_Neutral.yaml b/Removed yamls/RC1/KenderUT_Neutral.yaml new file mode 100644 index 00000000000..c45d150dbc5 --- /dev/null +++ b/Removed yamls/RC1/KenderUT_Neutral.yaml @@ -0,0 +1,17 @@ +Undertale: + progression_balancing: 50 + accessibility: items + route_required: neutral + key_hunt: random + key_pieces: 5 + rando_love: 'false' + rando_stats: 'false' + temy_include: 'true' + no_equips: 'false' + only_flakes: 'false' + prog_armor: 'false' + prog_weapons: 'false' + rando_item_button: 'true' +description: 'Generated by https://archipelago.gg/ for Undertale' +game: Undertale +name: KenderUT diff --git a/Removed yamls/RC1/Parker.yaml b/Removed yamls/RC1/Parker.yaml new file mode 100644 index 00000000000..d17640ebc87 --- /dev/null +++ b/Removed yamls/RC1/Parker.yaml @@ -0,0 +1,24 @@ +The Witness: + progression_balancing: 50 + accessibility: items + puzzle_randomization: sigma_normal + shuffle_symbols: 'true' + shuffle_doors: max + shuffle_lasers: 'false' + disable_non_randomized_puzzles: 'false' + shuffle_discarded_panels: 'true' + shuffle_vault_boxes: 'true' + shuffle_EPs: individual + EP_difficulty: normal + shuffle_postgame: 'true' + victory_condition: challenge + mountain_lasers: 7 + challenge_lasers: 11 + early_secret_area: 'false' + trap_percentage: 0 + puzzle_skip_amount: 30 + hint_amount: 49 + death_link: 'true' +description: 'Generated by https://archipelago.gg/ for The Witness' +game: The Witness +name: Parker diff --git a/Removed yamls/RC1/Phar.yaml b/Removed yamls/RC1/Phar.yaml new file mode 100644 index 00000000000..210f28fbdc5 --- /dev/null +++ b/Removed yamls/RC1/Phar.yaml @@ -0,0 +1,504 @@ +# What is this file? +# This file contains options which allow you to configure your multiworld experience while allowing others +# to play how they want as well. + +# How do I use it? +# The options in this file are weighted. This means the higher number you assign to a value, the more +# chances you have for that option to be chosen. For example, an option like this: +# +# map_shuffle: +# on: 5 +# off: 15 +# +# Means you have 5 chances for map shuffle to occur, and 15 chances for map shuffle to be turned off + +# I've never seen a file like this before. What characters am I allowed to use? +# This is a .yaml file. You are allowed to use most characters. +# To test if your yaml is valid or not, you can use this website: +# http://www.yamllint.com/ + +description: Template Name # Used to describe your yaml. Useful if you have multiple files +name: Phar # Your name in-game. Spaces will be replaced with underscores and there is a 16 character limit +#{player} will be replaced with the player's slot number. +#{PLAYER} will be replaced with the player's slot number if that slot number is greater than 1. +#{number} will be replaced with the counter value of the name. +#{NUMBER} will be replaced with the counter value of the name if the counter value is greater than 1. +game: # Pick a game to play + A Link to the Past: 1 +requires: + version: 0.3.3 # Version of Archipelago required for this yaml to work as expected. +A Link to the Past: + progression_balancing: + # A system that can move progression earlier, to try and prevent the player from getting stuck and bored early. + # A lower setting means more getting stuck. A higher setting means less getting stuck. + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 0 + # Maximum value is 99 + random: 0 + random-low: 0 + random-high: 0 + disabled: 0 # equivalent to 0 + normal: 0 # equivalent to 50 + extreme: 0 # equivalent to 99 + 15: 5 + + accessibility: + # Set rules for reachability of your items/locations. + # Locations: ensure everything can be reached and acquired. + # Items: ensure all logically relevant items can be acquired. + # Minimal: ensure what is needed to reach your goal can be acquired. + locations: 0 + items: 50 + minimal: 0 + + local_items: + # Forces these items to be in their native world. + [ ] + + non_local_items: + # Forces these items to be outside their native world. + [ ] + + start_inventory: + # Start with these items. + { } + + start_hints: + # Start with these item's locations prefilled into the !hint command. + [ ] + + start_location_hints: + # Start with these locations and their item prefilled into the !hint command + [ ] + + exclude_locations: + # Prevent these locations from having an important item + [ ] + + priority_locations: + # Prevent these locations from having an unimportant item + [ ] + + item_links: + # Share part of your item pool with other players. + [ ] + + ### Logic Section ### + glitches_required: # Determine the logic required to complete the seed + none: 0 # No glitches required + minor_glitches: 50 # Puts fake flipper, waterwalk, super bunny shenanigans, and etc into logic + overworld_glitches: 0 # Assumes the player has knowledge of both overworld major glitches (boots clips, mirror clips) and minor glitches + hybrid_major_glitches: 0 # In addition to overworld glitches, also requires underworld clips between dungeons. + no_logic: 0 # Your own items are placed with no regard to any logic; such as your Fire Rod can be on your Trinexx. + # Other players items are placed into your world under HMG logic + dark_room_logic: # Logic for unlit dark rooms + lamp: 50 # require the Lamp for these rooms to be considered accessible. + torches: 0 # in addition to lamp, allow the fire rod and presence of easily accessible torches for access + none: 0 # all dark rooms are always considered doable, meaning this may force completion of rooms in complete darkness + restrict_dungeon_item_on_boss: # aka ambrosia boss items + on: 0 # prevents unshuffled compasses, maps and keys to be boss drops, they can still drop keysanity and other players' items + off: 50 + ### End of Logic Section ### + bigkey_shuffle: # Big Key Placement + original_dungeon: 0 + own_dungeons: 0 + own_world: 0 + any_world: 50 + different_world: 0 + start_with: 0 + smallkey_shuffle: # Small Key Placement + original_dungeon: 50 + own_dungeons: 0 + own_world: 0 + any_world: 0 + different_world: 0 + universal: 0 + start_with: 0 + compass_shuffle: # Compass Placement + original_dungeon: 0 + own_dungeons: 0 + own_world: 0 + any_world: 0 + different_world: 0 + start_with: 50 + map_shuffle: # Map Placement + original_dungeon: 0 + own_dungeons: 0 + own_world: 0 + any_world: 0 + different_world: 0 + start_with: 50 + dungeon_counters: + on: 0 # Always display amount of items checked in a dungeon + pickup: 50 # Show when compass is picked up + default: 0 # Show when compass is picked up if the compass itself is shuffled + off: 0 # Never show item count in dungeons + progressive: # Enable or disable progressive items (swords, shields, bow) + on: 50 # All items are progressive + off: 0 # No items are progressive + grouped_random: 0 # Randomly decides for all items. Swords could be progressive, shields might not be + entrance_shuffle: + none: 50 # Vanilla game map. All entrances and exits lead to their original locations. You probably want this option + dungeonssimple: 0 # Shuffle just dungeons amongst each other, swapping dungeons entirely, so Hyrule Castle is always 1 dungeon + dungeonsfull: 0 # Shuffle any dungeon entrance with any dungeon interior, so Hyrule Castle can be 4 different dungeons, but keep dungeons to a specific world + dungeonscrossed: 0 # like dungeonsfull, but allow cross-world traversal through a dungeon. Warning: May force repeated dungeon traversal + simple: 0 # Entrances are grouped together before being randomized. Simple uses the most strict grouping rules + restricted: 0 # Less strict than simple + full: 0 # Less strict than restricted + crossed: 0 # Less strict than full + insanity: 0 # Very few grouping rules. Good luck + # you can also define entrance shuffle seed, like so: + crossed-1000: 0 # using this method, you can have the same layout as another player and share entrance information + # however, many other settings like logic, world state, retro etc. may affect the shuffle result as well. + crossed-group-myfriends: 0 # using this method, everyone with "group-myfriends" will share the same seed + goals: + ganon: 0 # Climb GT, defeat Agahnim 2, and then kill Ganon + crystals: 50 # Only killing Ganon is required. However, items may still be placed in GT + bosses: 0 # Defeat the boss of all dungeons, including Agahnim's tower and GT (Aga 2) + pedestal: 0 # Pull the Triforce from the Master Sword pedestal + ganon_pedestal: 0 # Pull the Master Sword pedestal, then kill Ganon + triforce_hunt: 0 # Collect 20 of 30 Triforce pieces spread throughout the worlds, then turn them in to Murahadala in front of Hyrule Castle + local_triforce_hunt: 0 # Collect 20 of 30 Triforce pieces spread throughout your world, then turn them in to Murahadala in front of Hyrule Castle + ganon_triforce_hunt: 0 # Collect 20 of 30 Triforce pieces spread throughout the worlds, then kill Ganon + local_ganon_triforce_hunt: 50 # Collect 20 of 30 Triforce pieces spread throughout your world, then kill Ganon + ice_rod_hunt: 0 # You start with everything needed to 216 the seed. Find the Ice rod, then kill Trinexx at Turtle rock. + open_pyramid: + goal: 50 # Opens the pyramid if the goal requires you to kill Ganon, unless the goal is Slow Ganon or All Dungeons + auto: 0 # Same as Goal, but also is closed if holes are shuffled and ganon is part of the shuffle pool + open: 0 # Pyramid hole is always open. Ganon's vulnerable condition is still required before he can he hurt + closed: 0 # Pyramid hole is always closed until you defeat Agahnim atop Ganon's Tower + triforce_pieces_mode: #Determine how to calculate the extra available triforce pieces. + extra: 50 # available = triforce_pieces_extra + triforce_pieces_required + percentage: 0 # available = (triforce_pieces_percentage /100) * triforce_pieces_required + available: 0 # available = triforce_pieces_available + triforce_pieces_extra: # Set to how many extra triforces pieces are available to collect in the world. + # Format "pieces: chance" + 0: 0 + 5: 50 + 10: 50 + 15: 0 + 20: 0 + triforce_pieces_percentage: # Set to how many triforce pieces according to a percentage of the required ones, are available to collect in the world. + # Format "pieces: chance" + 100: 0 #No extra + 150: 50 #Half the required will be added as extra + 200: 0 #There are the double of the required ones available. + triforce_pieces_available: # Set to how many triforces pieces are available to collect in the world. Default is 30. Max is 90, Min is 1 + # Format "pieces: chance" + 25: 0 + 30: 50 + 40: 0 + 50: 0 + triforce_pieces_required: # Set to how many out of X triforce pieces you need to win the game in a triforce hunt. Default is 20. Max is 90, Min is 1 + # Format "pieces: chance" + 15: 50 + 20: 50 + 30: 50 + 40: 0 + 50: 0 + crystals_needed_for_gt: # Crystals required to open GT + 0: 0 + random-range-2-5: 50 + random: 0 + random-low: 0 # any valid number, weighted towards the lower end + random-middle: 0 # any valid number, weighted towards the central range + random-high: 0 # any valid number, weighted towards the higher end + crystals_needed_for_ganon: # Crystals required to hurt Ganon + 0: 0 + random-range-4-7: 50 + random: 0 + random-low: 0 + random-middle: 0 + random-high: 0 + mode: + standard: 0 # Begin the game by rescuing Zelda from her cell and escorting her to the Sanctuary + open: 50 # Begin the game from your choice of Link's House or the Sanctuary + inverted: 0 # Begin in the Dark World. The Moon Pearl is required to avoid bunny-state in Light World, and the Light World game map is altered + retro_bow: + on: 0 # Zelda-1 like mode. You have to purchase a quiver to shoot arrows using rupees. + off: 50 + retro_caves: + on: 0 # Zelda-1 like mode. There are randomly placed take-any caves that contain one Sword and choices of Heart Container/Blue Potion. + off: 50 + hints: # On/Full: Put item and entrance placement hints on telepathic tiles and some NPCs, Full removes joke hints. + 'on': 50 + 'off': 0 + full: 0 + scams: # If on, these Merchants will no longer tell you what they're selling. + 'off': 50 + 'king_zora': 0 + 'bottle_merchant': 0 + 'all': 0 + swordless: + on: 2 # Your swords are replaced by rupees. Gameplay changes have been made to accommodate this change + off: 8 + item_pool: + easy: 0 # Doubled upgrades, progressives, and etc + normal: 50 # Item availability remains unchanged from vanilla game + hard: 50 # Reduced upgrade availability (max: 14 hearts, blue mail, tempered sword, fire shield, no silvers unless swordless) + expert: 0 # Minimum upgrade availability (max: 8 hearts, green mail, master sword, fighter shield, no silvers unless swordless) + item_functionality: + easy: 0 # Allow Hammer to damage ganon, Allow Hammer tablet collection, Allow swordless medallion use everywhere. + normal: 50 # Vanilla item functionality + hard: 0 # Reduced helpfulness of items (potions less effective, can't catch faeries, cape uses double magic, byrna does not grant invulnerability, boomerangs do not stun, silvers disabled outside ganon) + expert: 0 # Vastly reduces the helpfulness of items (potions barely effective, can't catch faeries, cape uses double magic, byrna does not grant invulnerability, boomerangs and hookshot do not stun, silvers disabled outside ganon) + tile_shuffle: # Randomize the tile layouts in flying tile rooms + on: 0 + off: 50 + misery_mire_medallion: # required medallion to open Misery Mire front entrance + random: 50 + Ether: 0 + Bombos: 0 + Quake: 0 + turtle_rock_medallion: # required medallion to open Turtle Rock front entrance + random: 50 + Ether: 0 + Bombos: 0 + Quake: 0 + ### Enemizer Section ### + boss_shuffle: + none: 50 # Vanilla bosses + basic: 0 # Existing bosses except Ganon and Agahnim are shuffled throughout dungeons + full: 0 # 3 bosses can occur twice + chaos: 0 # Any boss can appear any amount of times + singularity: 0 # Picks a boss, tries to put it everywhere that works, if there's spaces remaining it picks a boss to fill those + enemy_shuffle: # Randomize enemy placement + on: 0 + off: 50 + killable_thieves: # Make thieves killable + on: 0 # Usually turned on together with enemy_shuffle to make annoying thief placement more manageable + off: 50 + bush_shuffle: # Randomize the chance that bushes have enemies and the enemies under said bush + on: 0 + off: 50 + enemy_damage: + default: 50 # Vanilla enemy damage + shuffled: 0 # Enemies deal 0 to 4 hearts and armor helps + chaos: 0 # Enemies deal 0 to 8 hearts and armor just reshuffles the damage + enemy_health: + default: 50 # Vanilla enemy HP + easy: 0 # Enemies have reduced health + hard: 0 # Enemies have increased health + expert: 0 # Enemies have greatly increased health + pot_shuffle: + 'on': 0 # Keys, items, and buttons hidden under pots in dungeons are shuffled with other pots in their supertile + 'off': 50 # Default pot item locations + ### End of Enemizer Section ### + ### Beemizer ### + # can add weights for any whole number between 0 and 100 + beemizer_total_chance: # Remove items from the global item pool and replace them with single bees (fill bottles) and bee traps + 0: 0 # No junk fill items are replaced (Beemizer is off) + 25: 50 # 25% chance for each junk fill item (rupees, bombs and arrows) to be replaced with bees + 50: 0 # 50% chance for each junk fill item (rupees, bombs and arrows) to be replaced with bees + 75: 0 # 75% chance for each junk fill item (rupees, bombs and arrows) to be replaced with bees + 100: 0 # All junk fill items (rupees, bombs and arrows) are replaced with bees + beemizer_trap_chance: + 60: 50 # 60% chance for each beemizer replacement to be a trap, 40% chance to be a single bee + 70: 0 # 70% chance for each beemizer replacement to be a trap, 30% chance to be a single bee + 80: 0 # 80% chance for each beemizer replacement to be a trap, 20% chance to be a single bee + 90: 0 # 90% chance for each beemizer replacement to be a trap, 10% chance to be a single bee + 100: 0 # All beemizer replacements are traps + ### Shop Settings ### + shop_item_slots: # Maximum amount of shop slots to be filled with regular item pool items (such as Moon Pearl) + 0: 50 + 5: 0 + 15: 0 + 30: 0 + random: 0 # 0 to 30 evenly distributed + shop_price_modifier: # Percentage modifier for shuffled item prices in shops + # you can add additional values between minimum and maximum + 0: 0 # minimum value + 400: 0 # maximum value + random: 0 + random-low: 0 + random-high: 0 + 100: 50 + shop_shuffle: + none: 50 + g: 0 # Generate new default inventories for overworld/underworld shops, and unique shops + f: 0 # Generate new default inventories for every shop independently + i: 0 # Shuffle default inventories of the shops around + p: 0 # Randomize the prices of the items in shop inventories + u: 0 # Shuffle capacity upgrades into the item pool (and allow them to traverse the multiworld) + w: 0 # Consider witch's hut like any other shop and shuffle/randomize it too + P: 0 # Prices of the items in shop inventories cost hearts, arrow, or bombs instead of rupees + ip: 0 # Shuffle inventories and randomize prices + fpu: 0 # Generate new inventories, randomize prices and shuffle capacity upgrades into item pool + uip: 0 # Shuffle inventories, randomize prices and shuffle capacity upgrades into the item pool + # You can add more combos + ### End of Shop Section ### + shuffle_prizes: # aka drops + none: 0 # do not shuffle prize packs + g: 50 # shuffle "general" prize packs, as in enemy, tree pull, dig etc. + b: 0 # shuffle "bonk" prize packs + bg: 0 # shuffle both + timer: + none: 50 # No timer will be displayed. + timed: 0 # Starts with clock at zero. Green clocks subtract 4 minutes (total 20). Blue clocks subtract 2 minutes (total 10). Red clocks add two minutes (total 10). Winner is the player with the lowest time at the end. + timed_ohko: 0 # Starts the clock at ten minutes. Green clocks add five minutes (total 25). As long as the clock as at zero, Link will die in one hit. + ohko: 0 # Timer always at zero. Permanent OHKO. + timed_countdown: 0 # Starts the clock with forty minutes. Same clocks as timed mode, but if the clock hits zero you lose. You can still keep playing, though. + display: 0 # Displays a timer, but otherwise does not affect gameplay or the item pool. + countdown_start_time: # For timed_ohko and timed_countdown timer modes, the amount of time in minutes to start with + 0: 0 # For timed_ohko, starts in OHKO mode when starting the game + 10: 50 + 20: 0 + 30: 0 + 60: 0 + red_clock_time: # For all timer modes, the amount of time in minutes to gain or lose when picking up a red clock + -2: 50 + 1: 0 + blue_clock_time: # For all timer modes, the amount of time in minutes to gain or lose when picking up a blue clock + 1: 0 + 2: 50 + green_clock_time: # For all timer modes, the amount of time in minutes to gain or lose when picking up a green clock + 4: 50 + 10: 0 + 15: 0 + glitch_boots: + on: 50 # Start with Pegasus Boots in any glitched logic mode that makes use of them + off: 0 + # rom options section + random_sprite_on_event: # An alternative to specifying randomonhit / randomonexit / etc... in sprite down below. + enabled: # If enabled, sprite down below is ignored completely, (although it may become the sprite pool) + on: 0 + off: 1 + on_hit: # Random sprite on hit. Being hit by things that cause 0 damage still counts. + on: 1 + off: 0 + on_enter: # Random sprite on underworld entry. Note that entering hobo counts. + on: 0 + off: 1 + on_exit: # Random sprite on underworld exit. Exiting hobo does not count. + on: 0 + off: 1 + on_slash: # Random sprite on sword slash. Note, it still counts if you attempt to slash while swordless. + on: 0 + off: 1 + on_item: # Random sprite on getting an item. Anything that causes you to hold an item above your head counts. + on: 0 + off: 1 + on_bonk: # Random sprite on bonk. + on: 0 + off: 1 + on_everything: # Random sprite on ALL currently implemented events, even if not documented at present time. + on: 0 + off: 1 + use_weighted_sprite_pool: # Always on if no sprite_pool exists, otherwise it controls whether to use sprite as a weighted sprite pool + on: 0 + off: 1 + #sprite_pool: # When specified, limits the pool of sprites used for randomon-event to the specified pool. Uncomment to use this. + # - link + # - pride link + # - penguin link + # - random # You can specify random multiple times for however many potentially unique random sprites you want in your pool. + sprite: # Enter the name of your preferred sprite and weight it appropriately + random: 0 + randomonhit: 0 # Random sprite on hit + randomonenter: 0 # Random sprite on entering the underworld. + randomonexit: 0 # Random sprite on exiting the underworld. + randomonslash: 0 # Random sprite on sword slashes + randomonitem: 0 # Random sprite on getting items. + randomonbonk: 0 # Random sprite on bonk. + # You can combine these events like this. randomonhit-enter-exit if you want it on hit, enter, exit. + randomonall: 0 # Random sprite on any and all currently supported events. Refer to above for the supported events. + Lucario: 50 # To add other sprites: open the gui/Creator, go to adjust, select a sprite and write down the name the gui calls it + music: # If "off", all in-game music will be disabled + on: 50 + off: 0 + quickswap: # Enable switching items by pressing the L+R shoulder buttons + on: 50 + off: 0 + triforcehud: # Disable visibility of the triforce hud unless collecting a piece or speaking to Murahadala + normal: 0 # original behavior (always visible) + hide_goal: 0 # hide counter until a piece is collected or speaking to Murahadala + hide_required: 0 # Always visible, but required amount is invisible until determined by Murahadala + hide_both: 50 # Hide both under above circumstances + reduceflashing: # Reduces instances of flashing such as lightning attacks, weather, ether and more. + on: 50 + off: 0 + menuspeed: # Controls how fast the item menu opens and closes + normal: 50 + instant: 0 + double: 0 + triple: 0 + quadruple: 0 + half: 0 + heartcolor: # Controls the color of your health hearts + red: 50 + blue: 0 + green: 0 + yellow: 0 + random: 0 + heartbeep: # Controls the frequency of the low-health beeping + double: 0 + normal: 50 + half: 0 + quarter: 0 + off: 0 + ow_palettes: # Change the colors of the overworld + default: 0 # No changes + good: 50 # Shuffle the colors, with harmony in mind + blackout: 0 # everything black / blind mode + grayscale: 0 + negative: 0 + classic: 0 + dizzy: 0 + sick: 0 + puke: 0 + uw_palettes: # Change the colors of caves and dungeons + default: 0 # No changes + good: 50 # Shuffle the colors, with harmony in mind + blackout: 0 # everything black / blind mode + grayscale: 0 + negative: 0 + classic: 0 + dizzy: 0 + sick: 0 + puke: 0 + hud_palettes: # Change the colors of the hud + default: 0 # No changes + good: 50 # Shuffle the colors, with harmony in mind + blackout: 0 # everything black / blind mode + grayscale: 0 + negative: 0 + classic: 0 + dizzy: 0 + sick: 0 + puke: 0 + sword_palettes: # Change the colors of swords + default: 0 # No changes + good: 50 # Shuffle the colors, with harmony in mind + blackout: 0 # everything black / blind mode + grayscale: 0 + negative: 0 + classic: 0 + dizzy: 0 + sick: 0 + puke: 0 + shield_palettes: # Change the colors of shields + default: 0 # No changes + good: 50 # Shuffle the colors, with harmony in mind + blackout: 0 # everything black / blind mode + grayscale: 0 + negative: 0 + classic: 0 + dizzy: 0 + sick: 0 + puke: 0 + + death_link: + false: 50 + true: 0 + + allow_collect: # Allows for !collect / co-op to auto-open chests containing items for other players. + # Off by default, because it currently crashes on real hardware. + false: 0 + true: 50 +--- +name: Pharlique +game: Clique +Clique: + hard_mode: true + color: random \ No newline at end of file diff --git a/Removed yamls/RC1/Purple_Peak_SMZ3_early_sword_early_sword_normal.yaml b/Removed yamls/RC1/Purple_Peak_SMZ3_early_sword_early_sword_normal.yaml new file mode 100644 index 00000000000..ea413ff7fde --- /dev/null +++ b/Removed yamls/RC1/Purple_Peak_SMZ3_early_sword_early_sword_normal.yaml @@ -0,0 +1,19 @@ +SMZ3: + progression_balancing: 50 + accessibility: items + sm_logic: normal + sword_location: early + morph_location: early + goal: defeatboth + key_shuffle: none + open_tower: 7 + ganon_vulnerable: 7 + open_tourian: 4 + spin_jumps_animation: 'false' + heart_beep_speed: half + heart_color: blue + quick_swap: 'false' + energy_beep: 'true' +description: 'Generated by https://archipelago.gg/' +game: SMZ3 +name: Purple Peak diff --git a/Removed yamls/RC1/RiversHappyMusicAndViciousDemons.yaml b/Removed yamls/RC1/RiversHappyMusicAndViciousDemons.yaml new file mode 100644 index 00000000000..5ee2a397c5d --- /dev/null +++ b/Removed yamls/RC1/RiversHappyMusicAndViciousDemons.yaml @@ -0,0 +1,279 @@ +# Q. What is this file? +# A. This file contains options which allow you to configure your multiworld experience while allowing +# others to play how they want as well. +# +# Q. How do I use it? +# A. The options in this file are weighted. This means the higher number you assign to a value, the +# more chances you have for that option to be chosen. For example, an option like this: +# +# map_shuffle: +# on: 5 +# off: 15 +# +# Means you have 5 chances for map shuffle to occur, and 15 chances for map shuffle to be turned +# off. +# +# Q. I've never seen a file like this before. What characters am I allowed to use? +# A. This is a .yaml file. You are allowed to use most characters. +# To test if your yaml is valid or not, you can use this website: +# http://www.yamllint.com/ +# You can also verify your Archipelago settings are valid at this site: +# https://archipelago.gg/check + +# Your name in-game. Spaces will be replaced with underscores and there is a 16-character limit. +# {player} will be replaced with the player's slot number. +# {PLAYER} will be replaced with the player's slot number, if that slot number is greater than 1. +# {number} will be replaced with the counter value of the name. +# {NUMBER} will be replaced with the counter value of the name, if the counter value is greater than 1. +name: DoomedRivers + +# Used to describe your yaml. Useful if you have multiple files. +description: Default DOOM 1993 Template + +game: DOOM 1993 +requires: + version: 0.4.0 # Version of Archipelago required for this yaml to work as expected. + +DOOM 1993: + progression_balancing: + # A system that can move progression earlier, to try and prevent the player from getting stuck and bored early. + # A lower setting means more getting stuck. A higher setting means less getting stuck. + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 0 + # Maximum value is 99 + random: 0 + random-low: 0 + random-high: 0 + disabled: 0 # equivalent to 0 + normal: 1 # equivalent to 50 + extreme: 0 # equivalent to 99 + + accessibility: + # Set rules for reachability of your items/locations. + # Locations: ensure everything can be reached and acquired. + # Items: ensure all logically relevant items can be acquired. + # Minimal: ensure what is needed to reach your goal can be acquired. + locations: 0 + items: 50 + minimal: 0 + + local_items: + # Forces these items to be in their native world. + [] + + non_local_items: + # Forces these items to be outside their native world. + [] + + start_hints: + # Start with these item's locations prefilled into the !hint command. + [] + + start_location_hints: + # Start with these locations and their item prefilled into the !hint command + [] + + exclude_locations: + # Prevent these locations from having an important item + [] + + priority_locations: + # Prevent these locations from having an unimportant item + [] + + item_links: + # Share part of your item pool with other players. + [] + + difficulty: + # Choose the difficulty option. Those match DOOM's difficulty options. + # baby (I'm too young to die.) double ammos, half damage, less monsters or strength. + # easy (Hey, not too rough.) less monsters or strength. + # medium (Hurt me plenty.) Default. + # hard (Ultra-Violence.) More monsters or strength. + # nightmare (Nightmare!) Monsters attack more rapidly and respawn. + baby: 0 + easy: 0 + medium: 1 + hard: 0 + nightmare: 0 + + random_monsters: + # Choose how monsters are randomized. + # vanilla: No randomization + # shuffle: Monsters are shuffled within the level + # random_balanced: Monsters are completely randomized, but balanced based on existing ratio in the level. (Small monsters vs medium vs big) + vanilla: 0 + shuffle: 0 + random_balanced: 1 + + random_items: + # Choose how items are randomized. + # vanilla: No randomization + # shuffle: Items are shuffled within the level + # random_balanced: Items are completely randomized, but balanced based on existing ratio in the level. (Small item vs Big) + vanilla: 0 + shuffle: 0 + random_balanced: 1 + + allow_death_logic: + # Some locations require a timed puzzle that can only be tried once. + # After which if the player failed to get it, the location cannot be checked anymore. + # No progression items are placed in those are. There is a way, hovewer, to still get them: + # Get killed in the current map. The map will reset, you can now attempt the puzzle again. + false: 50 + true: 0 + + death_link: + # When you die, everyone dies. Of course the reverse is true too. + false: 50 + true: 0 + + episode1: + # Knee-Deep in the Dead + false: 0 + true: 50 + + episode2: + # The Shores of Hell + false: 0 + true: 1 + + episode3: + # Inferno + false: 1 + true: 0 + + start_with_computer_area_maps: + # Give the player all Computer Area Map items from the start. + false: 0 + true: 1 + +--- + +Muse Dash: + progression_balancing: 0 + accessibility: items + available_trap_types: all + # Activates deathlink... you know you want to. + # Default: off + death_link: off + + # How many songs you can start out with. + # Note: Starting songs are first in line to get 2 items under additional_item_percentage + # Range 3-10. Default: 5 + starting_song_count: 3 + + # How many extra songs that are added in between the starting songs and ending songs. + # Note: This value will be lower if other options limit songs too much. + # Range 15-500. Default: 30 + additional_song_count: 50 + + # Whether or not songs that come with the DLC 'Just As Planned' are included. + # Default: false + allow_just_as_planned_dlc_songs: 'true' + + # Whether or not the songs chosen are available in Streamer Mode. Recommended to only switch this on, if you want to stream Muse Dash. + # Default: false + streamer_mode_enabled: 'false' + + # The number of music sheets placed in the multiworld + # Range 5-35. Default: 20 + music_sheet_count_percentage: 20 + + # The number of music sheets required to win + # Range 50-100. Default: 80 + music_sheet_win_count_percentage: 70 + + # The percentage of songs that get a second reward + # Range 50-100. Default: 80 + additional_item_percentage: 80 + + # The number of traps placed in the multiworld + # Range 0-35. Default: 15 + trap_count_percentage: 35 + + # Sets the grade needed to get rewards. + # Accepts the following: 'any'/0, 'c'/1, 'b'/2, 'a'/3, 'pinks'/4, 'silvers'/5. + # Default: 'any' + grade_needed: 'any' + + # Limits the range of songs chosen, such that at least 1 difficulty is within the chosen range. (Does not include secret difficulties) + # Supports the following: + # 'any' / 0 : Difficulty 1-11 + # 'easy' / 1 : Difficulty 1-3 + # 'medium' / 2 : Difficulty 4-5 + # 'hard' / 3 : Difficulty 6-7 + # 'expert' / 4 : Difficulty 8-9 + # 'master' / 5 : Difficulty 10-11 + # 'manual' / 6 : Allows song_difficulty_min and song_difficulty_max + # Default: 'any' + song_difficulty_mode: 'manual' + + # The following Options are only available under 'manual'" Must be between 1 and 11. Should not be randomised. + song_difficulty_min: 6 + song_difficulty_max: 8 + + # Any Traps or Songs you would want when starting the game. Any songs here will be considered as part of Starting Song Count. + start_inventory: + Bad Apple!! feat. Nomico: 1 + # Bad Apple Trap: 10 + # "Bad Apple!! feat. Nomico": 1 + + # Any songs you would want included within the randomiser. Will count as a song for additional_song_count. + # You will need to use the full name of the song. (i.e. "Bad Apple!! feat. Nomico") You can find this in song select at the bottom right while playing a seed. + # Songs here will not be starting songs. Use start_inventory for that. + include_songs: + - Night of Nights + - Cirno's Perfect Math Class + - Brain Power + - Nyan Cat + - Glimmer + - Magic Spell + - Bang!! + - Bit-alize + - PeroPero in the Universe + - I don't care about Christmas though + - Dandelion's Daydream + - Give Me 5 + - Sand Maze + - Fireflies + - Tenri Kaku Jou + # - "Bad Apple!! feat. Nomico" + + # Any songs you would want excluded within the randomiser. + # You will need to use the full name of the song. (i.e. "Bad Apple!! feat. Nomico") You can find this in song select at the bottom right while playing a seed. + exclude_songs: + - PUPA + - sheep in the light + - -+ + - Marry me, Nightmare + - ManiFesto + + bad_apple_mode: + on: 0 + off: 20 + +# non_local_items: +# - Music Sheet +# - Bad Apple Trap +# - Random Wave Trap +# - Background Freeze Trap +# - Pixelate Trap +# - Gray Scale Trap +# - Chromatic Aberration Trap +# - Shadow Edge Trap +triggers: + - option_name: bad_apple_mode + option_result: on + option_category: Muse Dash + options: + Muse Dash: + start_inventory: + Bad Apple Trap: 150 + Bad Apple!! feat. Nomico: 1 + +description: 'Generated by https://archipelago.gg/' +game: Muse Dash +name: Rivers Dash diff --git a/Removed yamls/RC1/Seto_Undertale.yaml b/Removed yamls/RC1/Seto_Undertale.yaml new file mode 100644 index 00000000000..373bd8f93c0 --- /dev/null +++ b/Removed yamls/RC1/Seto_Undertale.yaml @@ -0,0 +1,93 @@ +name: Seto Undertale + +description: Undertale Genocide + +game: Undertale +requires: + version: 0.4.2 + +Undertale: + progression_balancing: + random: 0 + random-low: 0 + random-high: 0 + disabled: 1 + normal: 0 + extreme: 0 + + accessibility: + locations: 1 + items: 0 + minimal: 0 + + local_items: + [] + + non_local_items: + [] + + start_inventory: + {Butterscotch Pie: 8} + + start_hints: + [] + + start_location_hints: + [] + + exclude_locations: + [] + + priority_locations: + [] + + item_links: + [] + + route_required: + neutral: 0 + pacifist: 0 + genocide: 1 + all_routes: 0 + + key_hunt: + false: 1 + true: 0 + + key_pieces: + 5: 1 + random: 0 + random-low: 0 + random-high: 0 + + rando_love: + false: 50 + true: 0 + + rando_stats: + false: 0 + true: 1 + + temy_include: + false: 0 + true: 1 + + no_equips: + false: 1 + true: 0 + + only_flakes: + false: 1 + true: 0 + + prog_armor: + false: 1 + true: 0 + + prog_weapons: + false: 0 + true: 1 + + rando_item_button: + false: 1 + true: 0 diff --git a/Removed yamls/RC1/Sheen-SDV4.yaml b/Removed yamls/RC1/Sheen-SDV4.yaml new file mode 100644 index 00000000000..53c22f4f5e1 --- /dev/null +++ b/Removed yamls/RC1/Sheen-SDV4.yaml @@ -0,0 +1,155 @@ +description: Stardew Mage Knight +game: Stardew Valley +name: sheen_sdv +Stardew Valley: + progression_balancing: 50 + accessibility: items + goal: greatest_walnut_hunter + # community_center: Complete the community center + # grandpa_evaluation: Get four candles on grandpa's shrine. You do not have to wait for Year3 to get evaluated + # bottom_of_the_mines: Reach the bottom of the local mineshaft + # cryptic_note: Complete the "Cryptic Note" quest, which is to reach level 100 in the Skull Cavern + # master_angler: Catch every fish in the game + # complete_collection: Complete the museum's collection by donating all 95 minerals and artifacts + # full_house: Get married and have two children + # greatest_walnut_hunter: Find all 130 golden walnuts + # perfection: Attain perfection in your world, based on how the vanilla game defines it, using the perfection tracker. This goal is extremely long + starting_money: unlimited + # 0-50000: How much money to start with. The vanilla game starts you with 500, but having more can really streamline Archipelago + # vanilla: 500 + # extra: 2000 + # rich: 5000 + # very rich: 20000 + # filthy rich: 50000 + # unlimited: Play with unlimited money + profit_margin: 200 + # 25-400: Multiplier over all earned money in-game. When below 100, some crops are no longer profitable to grow. + # quarter: 25 + # half: 50 + # normal: 100 + # double: 200 + # triple: 300 + # quadruple: 400 + bundle_randomization: shuffled + # vanilla: The bundles in the Community Center will be the ones from the vanilla game (not remixed) + # thematic: The bundles are randomized while following their original theme. Summer Crops Bundle will contain random summer crops, etc + # shuffled: The bundles are randomized with no regard for their individual themes or even rooms. Any bundle can contain any bundle item + bundle_price: very_cheap + # very_cheap: Every bundle will require two fewer items (capped at 1 item) from their list of accepted items. For Vault bundles, it is a 2/5th discount on the amount + # cheap: Every bundle will require one fewer item (capped at 1 item) from their list of accepted items. For Vault bundles, it is a 1/5th discount on the amount + # normal: Every bundle will require the vanilla number of items. For Vault bundles, it is the vanilla amount + # expensive: Every bundle will require one extra item (capped at the number of possible items) from their list of accepted items. For Vault bundles, it is a 1/5th increase on the amount + entrance_randomization: buildings # This includes entrances from supported mods + # disabled: Entrances are normal + # pelican_town: Entrances in the main Pelican Town map are shuffled with each other + # non_progression: Entrances to all of the areas that are always accessible without needing an archipelago unlock, will be shuffled with each other + # buildings: Every area that is "inside" can be shuffled with one another, included areas that are not immediately accessible + # chaos: Same as "buildings", but entrances are re-shuffled EVERY SINGLE DAY. + season_randomization: randomized # In archipelago, at the end of every in game season, you can choose which season will be next from the ones you have unlocked + # disabled: Seasons are all immediately available and you will start in spring + # randomized: You will start with a random season, and will earn the other 3 in a random order as Archipelago items + # randomized_not_winter: Same as randomized, but you are garanteed not to start in Winter + # progressive: You will start in spring, and unlock season as Archipelago items, but in the vanilla order, as "Progressive Season" items. + cropsanity: disabled # Pierre and Jojamart have been reworked for better lore compatibility and game balance + # disabled: All seeds and saplings can be purchased normally + # shuffled: You need to unlock the ability to purchase individual seed and sapling types as archipelago items. Every unlock comes with a free sample of 1. Growing and harvesting the resulting crop is a check. + backpack_progression: early_progressive # This includes backpacks from supported mods + # vanilla: You buy your backpack upgrades at Pierre's + # progressive: Backpack uprades are in the pool, you can buy two checks at Pierre's + # early_progressive: Backpack uprades are in the pool, but one of them is place early in the multiworld + tool_progression: progressive + # vanilla: You buy your tool upgrades at Clint's + # progressive: Tool upgrades are in the pool, you can go ask Clint for checks using money and metal bars + elevator_progression: progressive # This includes elevators from supported mods + # vanilla: The mineshaft elevator is unlocked normally, as you progress through the mineshaft levels + # progressive: The mineshaft elevator is unlocked by Archipelago progressive items, and every 5 level in the mineshaft is a check. + # progressive_from_previous_floor: Same as progressive, but you need to reach that level by using a ladder from the previous floor. You cannot unlock an elevator check using the elevator + skill_progression: progressive # This includes skills from supported mods + # vanilla: The player skills will gain experience locally, normally + # progressive: The player skills are upgraded through received progressive levels, and earned experience sends checks accordingly + building_progression: progressive # This includes buildings from supported mods + # vanilla: Carpenter buildings are constructed normally + # progressive: Robin sells one-time checks for each buildings, and you receive free buildings as Archipelago items. + # Once received and constructed once, you can pay the vanilla price to construct more iterations of the same building + # progressive_early_shipping_bin: Same as progressive, but the shipping bin will be placed early in the multiworld + festival_locations: disabled + # disabled: There are no checks to be obtained at the festivals + # easy: Participating in the festivals will check locations, but they are easy to do and just showing up is usually enough + # hard: The festival checks are only granted when the player performs well enough in them, so they need to take them seriously + arcade_machine_locations: disabled + # disabled: The Arcade Machines are not included. + # victories: Both Arcade Machines contain one check, obtainable by winning the default gamemode once, with no modifications + # victories_easy: Same as victories, except both arcade machines are made considerably easier through in-game buffs + # Junimo Kart will have 8 Extra lives for every level + # Journey of the Prairie King will start with one of each upgrade, 2 extra lives, and the drop rate of powerups and money is considerable increased + # full_shuffling: Both of the Arcade Machines contain many checks, and many buffs (including the ones from victories_easy) will be received as Archipelago Items, making the games easier over time + special_order_locations: disabled + # disabled: Special orders are not included in the multiworld + # board_only: The Special order board and rewards are items, and completing orders for the first time grants a check + # board_qi: In addition to the board, the difficult Qi Special Orders from the walnut room are also included + help_wanted_locations: 0 + # 0-56 [MUST BE A MULTIPLE OF 7]: The number of help wanted quests that are archipelago checks. For every 7, 4 are item deliveries, and 1 of each [fishing, gathering, slaying] + fishsanity: none + # none: None of the caught fish are AP locations + # legendaries: Catching legendary fish are AP locations + # special: Catching a pre-defined selection of important fish are AP locations + # random_selection: A random selection of fish are chosen and need to be caught as AP locations + # all: Fishsanity! Every single fish being caught is an AP location. + # exclude_legendaries: Every fish except legendary fish + # exclude_hard_fish: Every fish except the ones considered difficult + # only_easy_fish: Only the easy fish are checks + museumsanity: none # On all settings except none, the traveling merchant will assist you in completing your museum + # none: Museum donations are not included in the Archipelago shuffling + # milestones: Every donation milestone that gives a vanilla reward will instead give a check. Museum rewards are in the item pool + # randomized: A random selection of minerals and artifacts are chosen and need to be donated to the museum as AP locations. Museum rewards are in the item pool + # all: Museumsanity! Every single mineral and artifact being donated is an AP location. + friendsanity: all # This includes friendship hearts from supported mod NPCs + # none: Relationships are not included in the Archipelago shuffling + # bachelors: Friendship up to 8 hearts with the town bachelors are shuffled + # starting_npcs: Friendship up to 10 hearts (8 for bachelors) with the starting NPCs are shuffled. This excludes NPCs that require an event or item to be reached, like Sandy, Krobus, Kent, etc. + # all: Friendship up to 10 hearts (8 for bachelors) with every NPC in the game are shuffled. + # all_with_marriage: Same as all, but bachelors must each be befriended up to 14 hearts, which includes marrying every single one in succession. Not recommended for new players + friendsanity_heart_size: 2 # This setting does not do anything if not friendsanity is "none" + # 1-8: How many hearts are granted per heart item, and how many hearts must be earned to send a single check. A higher number reduces heart item clutter in the pool. The last heart is bounded to the relationship maximum. + movement_buff_number: 8 + # 0-12: Number of movement speed buffs in the pool + luck_buff_number: 12 + # 0-12: Number of luck buffs in the pool + exclude_ginger_island: 'false' + # true/false: Forcefully excludes every item and location that is related to Ginger Island, and removes both the Obelisk and the Boat repair from the item pool. + # When activating this setting, you will never need to, nor be able to, go to Ginger Island. This includes island quests, special orders, fish, and Leo's friendsanity hearts. + trap_items: hard # On any setting with traps, the number of traps is semi-random, with a bias towards having one of each, then rolling for more randomly side by side with filler resource packs. + # no_traps: There are no trap items in the pool. Filler items are only resource packs. + # easy: Trap items are intended to be funny and not very punishing + # medium: Trap items are minor annoyances that a competent player will deal with reasonably easily + # hard: Trap items are major annoyances that can be fairly punishing + # hell: trap items are extremely punishing and difficult and will severely impact gameplay + # nightmare: Just, don't. Trust me. + multiple_day_sleep_enabled: 'true' + # true/false: New feature allowing you to sleep several days at once. It is recommended to turn this on to avoid the game taking too long + # It allows the player to quickly skip long periods of time, to reach specific seasons or events. All decay mechanics (friends, animals, fences) will apply. + multiple_day_sleep_cost: 0 + # 0-200: The cost of the multisleep feature, in in-game money, per day skipped. The default value of zero is very strong, so this allows you to customize your experience + experience_multiplier: 800 + # 25-400: Multiplier to the experience gained on player skills. 100 is the vanilla experience gain, 200 is double, and so on. + friendship_multiplier: 800 + # 25-400: Multiplier to the friendship points gained from interactions with NPCs. 100 is vanilla, 200 is double, and so on. + debris_multiplier: half + # vanilla: The farm will start with, and generate over time, the normal amount of debris. Debris are natural grass, weeds, stones, twigs, and trees that are not grown from a seed + # half: Starting and spawned debris are halved + # quarter: Starting and spawned debris are reduced to 25% of their normal rate + # none: The farm will start fully cleared, and no debris will ever spawn on it. You can still plant grass and trees yourself. + # start_clear: The farm is completely cleared at the beginning of the game, but will spawn debris normally afterwards + quick_start: 'true' + # true/false: Starting a new game will give you several quality of life items as gifts when starting the game. + gifting: 'true' + # true/false: Allows sending items as gifts to other Stardew players and receiving gifts from other Stardew players + mods: ["Magic", "Bigger Backpack"] # Choose any combination of the following list of supported mods. Items and locations are added for custom npcs and skills, if using friendsanity and progressive skills. Bigger mods have some unique checks as well. All mod regions can be randomized with the entrance randomizer + # ["DeepWoods", "Tractor Mod", "Bigger Backpack", "Skull Cavern Elevator", + # "Luck Skill", "Magic", "Socializing Skill", "Archaeology", + # "Cooking Skill", "Binning Skill", "Juna - Roommate NPC", + # "Professor Jasper Thomas", "Alec Revisited", "Custom NPC - Yoba", "Custom NPC Eugene", + # "'Prophet' Wellwick", "Mister Ginger (cat npc)", "Shiko - New Custom NPC", "Delores - Custom NPC", + # "Ayeisha - The Postal Worker (Custom NPC)", "Custom NPC - Riley"] + start_inventory: {"Dwarvish Translation Guide": 1, "Rusty Key": 1, "Golden Walnut": 30} + death_link: 'false' diff --git a/Removed yamls/RC1/SilvrisTerraria.yaml b/Removed yamls/RC1/SilvrisTerraria.yaml new file mode 100644 index 00000000000..b5e43c6852d --- /dev/null +++ b/Removed yamls/RC1/SilvrisTerraria.yaml @@ -0,0 +1,120 @@ +# Q. What is this file? +# A. This file contains options which allow you to configure your multiworld experience while allowing +# others to play how they want as well. +# +# Q. How do I use it? +# A. The options in this file are weighted. This means the higher number you assign to a value, the +# more chances you have for that option to be chosen. For example, an option like this: +# +# map_shuffle: +# on: 5 +# off: 15 +# +# Means you have 5 chances for map shuffle to occur, and 15 chances for map shuffle to be turned +# off. +# +# Q. I've never seen a file like this before. What characters am I allowed to use? +# A. This is a .yaml file. You are allowed to use most characters. +# To test if your yaml is valid or not, you can use this website: +# http://www.yamllint.com/ +# You can also verify your Archipelago settings are valid at this site: +# https://archipelago.gg/check + +# Your name in-game. Spaces will be replaced with underscores and there is a 16-character limit. +# {player} will be replaced with the player's slot number. +# {PLAYER} will be replaced with the player's slot number, if that slot number is greater than 1. +# {number} will be replaced with the counter value of the name. +# {NUMBER} will be replaced with the counter value of the name, if the counter value is greater than 1. +name: SilvrisTerraria + +# Used to describe your yaml. Useful if you have multiple files. +description: Default Terraria Template + +game: Terraria +requires: + version: 0.4.2 # Version of Archipelago required for this yaml to work as expected. + +Terraria: + progression_balancing: + # A system that can move progression earlier, to try and prevent the player from getting stuck and bored early. + # A lower setting means more getting stuck. A higher setting means less getting stuck. + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 0 + # Maximum value is 99 + random: 0 + random-low: 0 + random-high: 0 + disabled: 0 # equivalent to 0 + normal: 50 # equivalent to 50 + extreme: 0 # equivalent to 99 + + accessibility: + # Set rules for reachability of your items/locations. + # Locations: ensure everything can be reached and acquired. + # Items: ensure all logically relevant items can be acquired. + # Minimal: ensure what is needed to reach your goal can be acquired. + locations: 0 + items: 50 + minimal: 0 + + local_items: + # Forces these items to be in their native world. + [] + + non_local_items: + # Forces these items to be outside their native world. + [] + + start_inventory: + # Start with these items. + {} + + start_hints: + # Start with these item's locations prefilled into the !hint command. + ["Hardmode"] + + start_location_hints: + # Start with these locations and their item prefilled into the !hint command + [] + + exclude_locations: + # Prevent these locations from having an important item + [] + + priority_locations: + # Prevent these locations from having an unimportant item + [] + + item_links: + # Share part of your item pool with other players. + [] + + goal: + # The victory condition for your run. Stuff after the goal will not be shuffled. + mechanical_bosses: 50 + plantera: 0 + golem: 0 + empress_of_light: 0 + lunatic_cultist: 0 + moon_lord: 0 + zenith: 0 + + achievements: + # Adds checks upon collecting achievements. Achievements for clearing bosses and events are excluded. + # "Exclude Grindy" also excludes fishing achievements. + none: 0 + exclude_grindy: 50 + exclude_fishing: 0 + all: 0 + + fill_extra_checks_with: + # Applies if you have achievements enabled. "Useful Items" helps to make the early game less grindy. + # Items are rewarded to all players in your Terraria world. + coins: 0 + useful_items: 50 + + death_link: + # When you die, everyone dies. Of course the reverse is true too. + false: 50 + true: 0 diff --git a/Removed yamls/RC1/dennisw100_Terraria.yaml b/Removed yamls/RC1/dennisw100_Terraria.yaml new file mode 100644 index 00000000000..08b544f9900 --- /dev/null +++ b/Removed yamls/RC1/dennisw100_Terraria.yaml @@ -0,0 +1,17 @@ +Terraria: + progression_balancing: 50 + accessibility: items + goal: mechanical_bosses + # mechanical_bosses + # plantera + # golem + # empress_of_light + # lunatic_cultist + # moon_lord + # zenith + achievements: exclude_grindy + fill_extra_checks_with: useful_items + death_link: 'false' +description: 'Generated by https://archipelago.gg/ and edited by dennisw100' +game: Terraria +name: dennisw100 diff --git a/Removed yamls/RC1/speedweedDOOM.yaml b/Removed yamls/RC1/speedweedDOOM.yaml new file mode 100644 index 00000000000..b34f2390f8e --- /dev/null +++ b/Removed yamls/RC1/speedweedDOOM.yaml @@ -0,0 +1,178 @@ +# .JYJJ?7~^: .~?~. :^:. +# J55YY5PPGG5PBBBPJ~7YGGGPY?~. +# ^PYYYYY5YJPBBGGGBBBBBBGGBBBBPJ^.. +# ~P5YYJY5PGGBBBBGGGGGGGGGGGGGBBGPP5YYJJ?77~ +# .P5YYY5GBGGGBBBBBBBBBBBBBBGGGPJYYY5555PPGY +# !PY5PGBGGBGGGGGBGBBGGGGGGGGGG5Y55YJJJJYP~ +# ~GGGGPGGP5G5PGPGGGGBGGGGGGGGBP5YJYY5YPJ +# !PGGB#####J!GBP?Y5P5PGGGGPGGGGBPYJYYYPY. +# :J5GG&&&&&&J:Y&#GY?5BPPBGYGYYGGGGGYJ5PP? +# ^~!5PYB&&&&G:?&&&GB#&&&&&B!~P?YGGGGGPB5: +# :P5??JG##&P?#&#BP#&&&&&&7:Y&#JYBGB55GG^ +# .YY??7?GBBBBB#BBBBB#&&&&5:J&&&P?YGB57!J5: +# ~?!~:^?JB##BBBBBB##BBB##JY&&#GJ??5BP?. .: +# :. 7J7!PB##BBBBBBBBBBBBBPYJJ5PGGBBP7. +# .!^. 7??PB####B###BBPYJ?5#########G! +# ~~~J5P5PGPPPYJ?7^7Y############~ +# ^?PBB&&#BBBBG5PPGGJ!YJB##########B! +# .7P#&&BB&&&&#&&&&##&GG#GPGGB#####BBP? +# 5@&#PYY#&&&&&&&&&BB&&&&GYYYYY5P55Y?^ +# !B###P5&&&&&&&&&&PY5GGBB5YY~ .::.. +# YBBB#B&&&&&&&&&BYYY~.:^~~: +# ^B###G#&&&&&&&&#PY5? +# ^####Y?P####BGG5J??!:^:. +# 7PBG7!!7777!!!!!!^^^?J5J^ +# .^~!!!!!!!!!!!!!!^^~!JGBY^ +# ^!!!!!!!!!!!!!!~^^..^?GB? +# ~!!!!!!!!!!!!!!!^^: ^YBY. +# .!!!!!!!!!!!!!!!!^^^. .7B5. +# :!!!!!!!!!!!!!!!!~^^: !BP^ +# ^!!!!!!!!!!!!!!!!!^^^: ~GB7 ?PY^ +# .~!!!!!!!!!!!!!!!!^^:. :YB5!^^YBGY~ +# ^^~~!!!!!!!~~^:^^:. .!5GGGPY7: +# :~~^:...... .^^^. :^^:. +# .:^~~~^: :~^: +# ..:^~~~^:.. .^~~^: +# :!!!~~^^:. .^~~~^. +#:~7~^^:. :~~~^: +# .... :~~~!^:. +# .^~!?~~~. +# .:^^^: +name: speedweed + +# Used to describe your yaml. Useful if you have multiple files. +description: Default DOOM 1993 Template + +game: DOOM 1993 +requires: + version: 0.4.2 # Version of Archipelago required for this yaml to work as expected. + +DOOM 1993: + progression_balancing: + # A system that can move progression earlier, to try and prevent the player from getting stuck and bored early. + # A lower setting means more getting stuck. A higher setting means less getting stuck. + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 0 + # Maximum value is 99 + random: 0 + random-low: 0 + random-high: 0 + disabled: 0 # equivalent to 0 + normal: 50 # equivalent to 50 + extreme: 0 # equivalent to 99 + + accessibility: + # Set rules for reachability of your items/locations. + # Locations: ensure everything can be reached and acquired. + # Items: ensure all logically relevant items can be acquired. + # Minimal: ensure what is needed to reach your goal can be acquired. + locations: 0 + items: 50 + minimal: 0 + + local_items: + # Forces these items to be in their native world. + [] + + non_local_items: + # Forces these items to be outside their native world. + [] + + start_inventory: + # Start with these items. + {} + + start_hints: + # Start with these item's locations prefilled into the !hint command. + [] + + start_location_hints: + # Start with these locations and their item prefilled into the !hint command + [] + + exclude_locations: + # Prevent these locations from having an important item + [] + + priority_locations: + # Prevent these locations from having an unimportant item + [] + + item_links: + # Share part of your item pool with other players. + [] + + difficulty: + # Choose the difficulty option. Those match DOOM's difficulty options. + # baby (I'm too young to die.) double ammos, half damage, less monsters or strength. + # easy (Hey, not too rough.) less monsters or strength. + # medium (Hurt me plenty.) Default. + # hard (Ultra-Violence.) More monsters or strength. + # nightmare (Nightmare!) Monsters attack more rapidly and respawn. + baby: 0 + easy: 0 + medium: 0 + hard: 1 + nightmare: 0 + + random_monsters: + # Choose how monsters are randomized. + # vanilla: No randomization + # shuffle: Monsters are shuffled within the level + # random_balanced: Monsters are completely randomized, but balanced based on existing ratio in the level. (Small monsters vs medium vs big) + vanilla: 0 + shuffle: 50 + random_balanced: 0 + + random_pickups: + # Choose how pickups are randomized. + # vanilla: No randomization + # shuffle: Pickups are shuffled within the level + # random_balanced: Pickups are completely randomized, but balanced based on existing ratio in the level. (Small pickups vs Big) + vanilla: 0 + shuffle: 50 + random_balanced: 0 + + allow_death_logic: + # Some locations require a timed puzzle that can only be tried once. + # After which, if the player failed to get it, the location cannot be checked anymore. + # By default, no progression items are placed here. There is a way, hovewer, to still get them: + # Get killed in the current map. The map will reset, you can now attempt the puzzle again. + false: 50 + true: 0 + + start_with_computer_area_maps: + # Give the player all Computer Area Map items from the start. + false: 50 + true: 0 + + death_link: + # When you die, everyone dies. Of course the reverse is true too. + false: 0 + true: 1 + + episode1: + # Knee-Deep in the Dead. + # If none of the episodes are chosen, Episode 1 will be chosen by default. + false: 0 + true: 50 + + episode2: + # The Shores of Hell + # If none of the episodes are chosen, Episode 1 will be chosen by default. + false: 0 + true: 50 + + episode3: + # Inferno + # If none of the episodes are chosen, Episode 1 will be chosen by default. + false: 0 + true: 50 + + episode4: + # Thy Flesh Consumed. + # If none of the episodes are chosen, Episode 1 will be chosen by default. + # This episode is very difficult. + false: 0 + true: 50 diff --git a/Removed yamls/Stardew Valley.yaml b/Removed yamls/Stardew Valley.yaml new file mode 100644 index 00000000000..62fcf783d4a --- /dev/null +++ b/Removed yamls/Stardew Valley.yaml @@ -0,0 +1,469 @@ +# Q. What is this file? +# A. This file contains options which allow you to configure your multiworld experience while allowing +# others to play how they want as well. +# +# Q. How do I use it? +# A. The options in this file are weighted. This means the higher number you assign to a value, the +# more chances you have for that option to be chosen. For example, an option like this: +# +# map_shuffle: +# on: 5 +# off: 15 +# +# Means you have 5 chances for map shuffle to occur, and 15 chances for map shuffle to be turned +# off. +# +# Q. I've never seen a file like this before. What characters am I allowed to use? +# A. This is a .yaml file. You are allowed to use most characters. +# To test if your yaml is valid or not, you can use this website: +# http://www.yamllint.com/ +# You can also verify your Archipelago settings are valid at this site: +# https://archipelago.gg/check + +# Your name in-game. Spaces will be replaced with underscores and there is a 16-character limit. +# {player} will be replaced with the player's slot number. +# {PLAYER} will be replaced with the player's slot number, if that slot number is greater than 1. +# {number} will be replaced with the counter value of the name. +# {NUMBER} will be replaced with the counter value of the name, if the counter value is greater than 1. +name: Player{number} + +# Used to describe your yaml. Useful if you have multiple files. +description: Default Stardew Valley Template + +game: Stardew Valley +requires: + version: 0.4.2 # Version of Archipelago required for this yaml to work as expected. + +Stardew Valley: + progression_balancing: + # A system that can move progression earlier, to try and prevent the player from getting stuck and bored early. + # A lower setting means more getting stuck. A higher setting means less getting stuck. + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 0 + # Maximum value is 99 + random: 0 + random-low: 0 + random-high: 0 + disabled: 0 # equivalent to 0 + normal: 50 # equivalent to 50 + extreme: 0 # equivalent to 99 + + accessibility: + # Set rules for reachability of your items/locations. + # Locations: ensure everything can be reached and acquired. + # Items: ensure all logically relevant items can be acquired. + # Minimal: ensure what is needed to reach your goal can be acquired. + locations: 0 + items: 50 + minimal: 0 + + local_items: + # Forces these items to be in their native world. + [] + + non_local_items: + # Forces these items to be outside their native world. + [] + + start_inventory: + # Start with these items. + {} + + start_hints: + # Start with these item's locations prefilled into the !hint command. + [] + + start_location_hints: + # Start with these locations and their item prefilled into the !hint command + [] + + exclude_locations: + # Prevent these locations from having an important item + [] + + priority_locations: + # Prevent these locations from having an unimportant item + [] + + goal: + # 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: 50 + grandpa_evaluation: 0 + bottom_of_the_mines: 0 + cryptic_note: 0 + master_angler: 0 + complete_collection: 0 + full_house: 0 + greatest_walnut_hunter: 0 + perfection: 0 + + starting_money: + # Amount of gold when arriving at the farm. + # Set to -1 or unlimited for infinite money in this playthrough + # + # You can define additional values between the minimum and maximum values. + # Minimum value is -1 + # Maximum value is 50000 + random: 0 + random-low: 0 + random-high: 0 + unlimited: 0 # equivalent to -1 + vanilla: 0 # equivalent to 500 + extra: 0 # equivalent to 2000 + rich: 50 # equivalent to 5000 + very rich: 0 # equivalent to 20000 + filthy rich: 0 # equivalent to 50000 + + profit_margin: + # Multiplier over all gold earned in-game by the player. + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 25 + # Maximum value is 400 + random: 0 + random-low: 0 + random-high: 0 + quarter: 0 # equivalent to 25 + half: 0 # equivalent to 50 + normal: 50 # equivalent to 100 + double: 0 # equivalent to 200 + triple: 0 # equivalent to 300 + quadruple: 0 # equivalent to 400 + + bundle_randomization: + # What items are needed for the community center bundles? + # Vanilla: Standard bundles from the vanilla game + # Thematic: Every bundle will require random items compatible with their original theme + # Shuffled: Every bundle will require random items and follow no particular structure + vanilla: 0 + thematic: 50 + shuffled: 0 + + bundle_price: + # How many items are needed for the community center bundles? + # Very Cheap: Every bundle will require 2 items fewer than usual + # Cheap: Every bundle will require 1 item fewer than usual + # Normal: Every bundle will require the vanilla number of items + # Expensive: Every bundle will require 1 extra item when applicable + very_cheap: 0 + cheap: 0 + normal: 50 + expensive: 0 + + entrance_randomization: + # 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! + disabled: 0 + pelican_town: 0 + non_progression: 0 + buildings: 50 + chaos: 0 + + season_randomization: + # 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: 0 + randomized: 50 + randomized_not_winter: 0 + progressive: 0 + + cropsanity: + # 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 + disabled: 50 + shuffled: 50 + + backpack_progression: + # How is the backpack progression handled? + # Vanilla: You can buy them at Pierre's General Store. + # Progressive: You will randomly find Progressive Backpack upgrades. + # Early Progressive: You can expect your first Backpack in sphere 1. + vanilla: 0 + progressive: 0 + early_progressive: 50 + + tool_progression: + # How is the tool progression handled? + # Vanilla: Clint will upgrade your tools with ore. + # Progressive: You will randomly find Progressive Tool upgrades. + vanilla: 0 + progressive: 50 + + skill_progression: + # 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. + vanilla: 0 + progressive: 50 + + building_progression: + # How is the building progression handled? + # Vanilla: You will 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. + vanilla: 0 + progressive: 0 + progressive_early_shipping_bin: 50 + + festival_locations: + # 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 + disabled: 50 + easy: 0 + hard: 0 + + elevator_progression: + # 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 + vanilla: 0 + progressive: 0 + progressive_from_previous_floor: 50 + + arcade_machine_locations: + # How are the Arcade Machines handled? + # Disabled: The arcade machines are not included in the Archipelago shuffling. + # 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. + # 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. + disabled: 0 + victories: 0 + victories_easy: 0 + full_shuffling: 50 + + special_order_locations: + # How are the Special Orders handled? + # 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 + disabled: 0 + board_only: 00 + board_qi: 50 + + help_wanted_locations: + # How many "Help Wanted" quests need to be completed as Archipelago Locations + # 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. + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 0 + # Maximum value is 56 + random: 0 + random-low: 0 + random-high: 0 + none: 0 # equivalent to 0 + minimum: 0 # equivalent to 7 + normal: 0 # equivalent to 14 + lots: 0 # equivalent to 28 + maximum: 50 # equivalent to 56 + + fishsanity: + # Locations for catching fish? + # 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 + # Randomized: A random selection of fish are checks + # All: Every single fish in the game is a location that contains an item. Pairs well with the Master Angler Goal + # Exclude Legendaries: Every fish except legendaries + # Exclude Hard Fish: Every fish under difficulty 80 + # Only Easy Fish: Every fish under difficulty 50 + none: 0 + legendaries: 0 + special: 0 + randomized: 0 + all: 50 + exclude_legendaries: 0 + exclude_hard_fish: 0 + only_easy_fish: 0 + + museumsanity: + # Locations for museum donations? + # 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 + none: 0 + milestones: 0 + randomized: 0 + all: 50 + + friendsanity: + # 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. + none: 0 + bachelors: 0 + starting_npcs: 0 + all: 50 + all_with_marriage: 0 + + friendsanity_heart_size: + # If using friendsanity, how many hearts are received per 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 + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 1 + # Maximum value is 8 + 2: 50 + random: 0 + random-low: 0 + random-high: 0 + + movement_buff_number: + # Number of movement speed buffs to the player that exist as items in the pool. + # Each movement speed buff is a +25% multiplier that stacks additively + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 0 + # Maximum value is 12 + 4: 0 + random: 0 + random-low: 0 + random-high: 20 + + luck_buff_number: + # Number of luck buffs to the player that exist as items in the pool. + # Each luck buff is a bonus to daily luck of 0.025 + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 0 + # Maximum value is 12 + 4: 0 + random: 0 + random-low: 0 + random-high: 50 + + exclude_ginger_island: + # Exclude Ginger Island? + # This option will forcefully exclude everything related to Ginger Island from the slot. + # If you pick a goal that requires Ginger Island, you cannot exclude it and it will get included anyway + false: 50 + true: 0 + + trap_items: + # When rolling filler items, including resource packs, the game can also roll trap items. + # This setting is for choosing if traps will be in the item pool, and if so, how punishing they will be. + no_traps: 0 + easy: 0 + medium: 50 + hard: 0 + hell: 0 + nightmare: 0 + + multiple_day_sleep_enabled: + # Enable the ability to sleep automatically for multiple days straight? + false: 0 + true: 50 + + multiple_day_sleep_cost: + # How much gold it will cost to use MultiSleep. You will have to pay that amount for each day skipped. + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 0 + # Maximum value is 200 + random: 0 + random-low: 0 + random-high: 0 + free: 50 # equivalent to 0 + cheap: 0 # equivalent to 25 + medium: 0 # equivalent to 50 + expensive: 0 # equivalent to 100 + + experience_multiplier: + # How fast you want to earn skill experience. A lower setting mean less experience. + # A higher setting means more experience. + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 25 + # Maximum value is 800 + random: 0 + random-low: 0 + random-high: 0 + half: 0 # equivalent to 50 + vanilla: 0 # equivalent to 100 + double: 50 # equivalent to 200 + triple: 0 # equivalent to 300 + quadruple: 0 # equivalent to 400 + + friendship_multiplier: + # How fast you want to earn friendship points with villagers. + # A lower setting mean less friendship per action. + # A higher setting means more friendship per action. + # + # You can define additional values between the minimum and maximum values. + # Minimum value is 25 + # Maximum value is 800 + random: 0 + random-low: 0 + random-high: 0 + half: 0 # equivalent to 50 + vanilla: 0 # equivalent to 100 + double: 50 # equivalent to 200 + triple: 0 # equivalent to 300 + quadruple: 0 # equivalent to 400 + + debris_multiplier: + # How much debris will spawn on the player's farm? + # Vanilla: debris spawns normally + # Half: debris will spawn at half the normal rate + # Quarter: debris will spawn at one quarter of the normal rate + # None: No debris will spawn on the farm, ever + # Start Clear: debris will spawn at the normal rate, but the farm will be completely clear when starting the game + vanilla: 0 + half: 50 + quarter: 0 + none: 0 + start_clear: 0 + + quick_start: + # Do you want the quick start package? You will get a few items to help early game automation, + # so you can use the multiple day sleep at its maximum. + false: 0 + true: 50 + + gifting: + # Do you want to enable gifting items to and from other Stardew Valley worlds? + false: 0 + true: 50 + + mods: + # List of mods that will be considered for shuffling. + [] + + death_link: + # When you die, everyone dies. Of course the reverse is true too. + false: 50 + true: 0 diff --git a/Removed yamls/Stardew allsanity.yaml b/Removed yamls/Stardew allsanity.yaml new file mode 100644 index 00000000000..343dfce67de --- /dev/null +++ b/Removed yamls/Stardew allsanity.yaml @@ -0,0 +1,39 @@ +Stardew Valley: + progression_balancing: 50 + accessibility: items + goal: perfection + starting_money: random + profit_margin: 200 + bundle_randomization: shuffled + bundle_price: expensive + entrance_randomization: chaos + season_randomization: randomized + cropsanity: shuffled + backpack_progression: progressive + tool_progression: progressive + skill_progression: progressive + building_progression: progressive + festival_locations: hard + arcade_machine_locations: full_shuffling + special_order_locations: board_qi + help_wanted_locations: 56 + fishsanity: all + museumsanity: all + friendsanity: all_with_marriage + friendsanity_heart_size: 1 + player_buff_number: 12 + exclude_ginger_island: 'false' + trap_items: nightmare + multiple_day_sleep_enabled: 'true' + multiple_day_sleep_cost: 0 + experience_multiplier: 200 + friendship_multiplier: 200 + debris_multiplier: half + quick_start: 'true' + gifting: 'true' + gift_tax: 20 + mods: ["DeepWoods", "Tractor Mod", "Bigger Backpack", "Luck Skill", "Magic", "Socializing Skill", "Archaeology", "Cooking Skill", "Binning Skill", "Juna - Roommate NPC", "Professor Jasper Thomas", "Alec Revisited", "Custom NPC - Yoba", "Custom NPC Eugene", "'Prophet' Wellwick", "Mister Ginger (cat npc)", "Shiko - New Custom NPC", "Delores - Custom NPC", "Ayeisha - The Postal Worker (Custom NPC)"] + death_link: 'true' +description: 'Generated by https://archipelago.gg/' +game: Stardew Valley +name: MyName \ No newline at end of file diff --git a/Removed yamls/Stardew_Valley.yaml b/Removed yamls/Stardew_Valley.yaml new file mode 100644 index 00000000000..dd25859ee9e --- /dev/null +++ b/Removed yamls/Stardew_Valley.yaml @@ -0,0 +1,41 @@ +Stardew Valley: + progression_balancing: 50 + accessibility: locations + goal: perfection + starting_money: -1 + profit_margin: 200 + bundle_randomization: thematic + bundle_price: very_cheap + entrance_randomization: buildings + season_randomization: randomized + cropsanity: shuffled + backpack_progression: early_progressive + tool_progression: progressive + skill_progression: progressive + building_progression: progressive_early_shipping_bin + festival_locations: hard + elevator_progression: progressive + arcade_machine_locations: disabled + special_order_locations: board_qi + help_wanted_locations: 0 + fishsanity: only_easy_fish + museumsanity: none + friendsanity: all_with_marriage + friendsanity_heart_size: 4 + movement_buff_number: 4 + luck_buff_number: 4 + exclude_ginger_island: 'false' + trap_items: nightmare + multiple_day_sleep_enabled: 'true' + multiple_day_sleep_cost: 0 + experience_multiplier: 800 + friendship_multiplier: 800 + debris_multiplier: none + quick_start: 'true' + gifting: 'true' + death_link: 'false' + start_inventory: + {"Movement Speed Bonus": 4} +description: 'Generated by https://archipelago.gg/' +game: Stardew Valley +name: Tester diff --git a/Removed yamls/Tester - 3.x.x.yaml b/Removed yamls/Tester - 3.x.x.yaml new file mode 100644 index 00000000000..aad69a26b96 --- /dev/null +++ b/Removed yamls/Tester - 3.x.x.yaml @@ -0,0 +1,34 @@ +Stardew Valley: + progression_balancing: 50 + accessibility: items + goal: community_center + starting_money: 5000 + resource_pack_multiplier: 100 + bundle_randomization: thematic + bundle_price: normal + entrance_randomization: disabled + season_randomization: randomized + cropsanity: shuffled + backpack_progression: early_progressive + tool_progression: progressive + skill_progression: progressive + building_progression: progressive_early_shipping_bin + elevator_progression: progressive_from_previous_floor + arcade_machine_locations: full_shuffling + help_wanted_locations: 7 + fishsanity: none + museumsanity: milestones + friendsanity: all + player_buff_number: 4 + multiple_day_sleep_enabled: 'true' + multiple_day_sleep_cost: 0 + experience_multiplier: 200 + friendship_multiplier: 200 + debris_multiplier: half + quick_start: 'true' + gifting: 'true' + gift_tax: 20 + death_link: 'false' +description: 'Generated by https://archipelago.gg/' +game: Stardew Valley +name: Tester diff --git a/worlds/stardew_valley/__init__.py b/worlds/stardew_valley/__init__.py index 4415cf32ad6..2033504045b 100644 --- a/worlds/stardew_valley/__init__.py +++ b/worlds/stardew_valley/__init__.py @@ -10,6 +10,7 @@ from .locations import location_table, create_locations, LocationData from .logic.logic import StardewLogic from .logic.time_logic import MAX_MONTHS +from .logic.bundle_logic import BundleLogic from .options import StardewValleyOptions, SeasonRandomization, Goal, BundleRandomization, BundlePrice, NumberOfLuckBuffs, NumberOfMovementBuffs, \ BackpackProgression, BuildingProgression, ExcludeGingerIsland from .regions import create_regions @@ -65,6 +66,7 @@ class StardewValleyWorld(World): options_dataclass = StardewValleyOptions options: StardewValleyOptions + bundle: BundleLogic logic: StardewLogic web = StardewWebWorld() @@ -183,7 +185,7 @@ def setup_construction_events(self): def setup_victory(self): if self.options.goal == Goal.option_community_center: self.create_event_location(location_table[GoalName.community_center], - self.logic.can_complete_community_center().simplify(), + self.logic.bundle.can_complete_community_center().simplify(), Event.victory) elif self.options.goal == Goal.option_grandpa_evaluation: self.create_event_location(location_table[GoalName.grandpa_evaluation], @@ -195,7 +197,7 @@ def setup_victory(self): Event.victory) elif self.options.goal == Goal.option_cryptic_note: self.create_event_location(location_table[GoalName.cryptic_note], - self.logic.can_complete_quest("Cryptic Note").simplify(), + self.logic.quest.can_complete_quest("Cryptic Note").simplify(), Event.victory) elif self.options.goal == Goal.option_master_angler: self.create_event_location(location_table[GoalName.master_angler], diff --git a/worlds/stardew_valley/data/craftable_data.py b/worlds/stardew_valley/data/craftable_data.py index 4ac8c614b72..386625ae019 100644 --- a/worlds/stardew_valley/data/craftable_data.py +++ b/worlds/stardew_valley/data/craftable_data.py @@ -129,7 +129,7 @@ def create_recipe(name: str, ingredients: Dict[str, int], source: RecipeSource) basic_fertilizer = skill_recipe(Fertilizer.basic, Skill.farming, 1, {Material.sap: 2}) quality_fertilizer = skill_recipe(Fertilizer.quality, Skill.farming, 9, {Material.sap: 2, Fish.any: 1}) deluxe_fertilizer = ap_recipe(Fertilizer.deluxe, {MetalBar.iridium: 1, Material.sap: 40}) -basic_speed_gro = skill_recipe(SpeedGro.basic, Skill.farming, 3, {ArtisanGood.pine_tar: 1, WaterItem.clam: 1}) +basic_speed_gro = skill_recipe(SpeedGro.basic, Skill.farming, 3, {ArtisanGood.pine_tar: 1, Fish.clam: 1}) deluxe_speed_gro = skill_recipe(SpeedGro.deluxe, Skill.farming, 8, {ArtisanGood.oak_resin: 1, WaterItem.coral: 1}) hyper_speed_gro = ap_recipe(SpeedGro.hyper, {Ore.radioactive: 1, Fossil.bone_fragment: 3, Loot.solar_essence: 1}) basic_retaining_soil = skill_recipe(RetainingSoil.basic, Skill.farming, 4, {Material.stone: 2}) diff --git a/worlds/stardew_valley/data/fish_data.py b/worlds/stardew_valley/data/fish_data.py index 5146297c456..7fcccbb0e40 100644 --- a/worlds/stardew_valley/data/fish_data.py +++ b/worlds/stardew_valley/data/fish_data.py @@ -1,10 +1,11 @@ from dataclasses import dataclass -from typing import List, Tuple, Union, Optional +from typing import List, Tuple, Union, Optional, Set from . import season_data as season from .game_item import GameItem -from ..strings.fish_names import Fish -from ..strings.region_names import Region +from ..strings.fish_names import Fish, SVEFish +from ..strings.region_names import Region, SVERegion +from ..mods.mod_data import ModNames @dataclass(frozen=True) @@ -14,7 +15,7 @@ class FishItem(GameItem): difficulty: int legendary: bool extended_family: bool - mod_name: Optional[str] + mod_name: Optional[str] = None def __repr__(self): return f"{self.name} [{self.item_id}] (Locations: {self.locations} |" \ @@ -42,6 +43,13 @@ def __repr__(self): ginger_island_river = (Region.island_west,) pirate_cove = (Region.pirate_cove,) +crimson_badlands = (SVERegion.crimson_badlands,) +shearwater = (SVERegion.shearwater,) +highlands = (SVERegion.highlands,) +sprite_spring = (SVERegion.sprite_spring,) +fable_reef = (SVERegion.fable_reef,) +vineyard = (SVERegion.blue_moon_vineyard,) + all_fish: List[FishItem] = [] @@ -121,6 +129,35 @@ def create_fish(name: str, item_id: int, locations: Tuple[str, ...], seasons: Un legend_ii = create_fish(Fish.legend_ii, 163, mountain_lake, season.spring, 110, True, True) radioactive_carp = create_fish(Fish.radioactive_carp, 682, sewers, season.all_seasons, 80, True, True) +baby_lunaloo = create_fish(SVEFish.baby_lunaloo, 3006, ginger_island_ocean, season.all_seasons, 15, mod_name=ModNames.sve) +bonefish = create_fish(SVEFish.bonefish, 3013, crimson_badlands, season.all_seasons, 70, mod_name=ModNames.sve) +bull_trout = create_fish(SVEFish.bull_trout, 3014, forest_river, season.not_spring, 45, mod_name=ModNames.sve) +butterfish = create_fish(SVEFish.butterfish, 3015, shearwater, season.not_winter, 75, mod_name=ModNames.sve) +clownfish = create_fish(SVEFish.clownfish, 3016, ginger_island_ocean, season.all_seasons, 45, mod_name=ModNames.sve) +daggerfish = create_fish(SVEFish.daggerfish, 3017, highlands, season.all_seasons, 50, mod_name=ModNames.sve) +frog = create_fish(SVEFish.frog, 3023, mountain_lake, (season.spring, season.summer), 70, mod_name=ModNames.sve) +gemfish = create_fish(SVEFish.gemfish, 3027, highlands, season.all_seasons, 100, mod_name=ModNames.sve) +goldenfish = create_fish(SVEFish.goldenfish, 3031, sprite_spring, season.all_seasons, 60, mod_name=ModNames.sve) +grass_carp = create_fish(SVEFish.grass_carp, 3034, secret_woods, (season.spring, season.summer), 85, mod_name=ModNames.sve) +king_salmon = create_fish(SVEFish.king_salmon, 3044, forest_river, (season.spring, season.summer), 80, mod_name=ModNames.sve) +kittyfish = create_fish(SVEFish.kittyfish, 3045, shearwater, (season.fall, season.winter), 85, mod_name=ModNames.sve) +lunaloo = create_fish(SVEFish.lunaloo, 3049, ginger_island_ocean, season.all_seasons, 70, mod_name=ModNames.sve) +meteor_carp = create_fish(SVEFish.meteor_carp, 3051, sprite_spring, season.all_seasons, 80, mod_name=ModNames.sve) +minnow = create_fish(SVEFish.minnow, 3052, town_river, season.all_seasons, 1, mod_name=ModNames.sve) +puppyfish = create_fish(SVEFish.puppyfish, 3061, shearwater, season.not_winter, 85, mod_name=ModNames.sve) +radioactive_bass = create_fish(SVEFish.radioactive_bass, 3062, sewers, season.all_seasons, 90, mod_name=ModNames.sve) +seahorse = create_fish(SVEFish.seahorse, 3068, ginger_island_ocean, season.all_seasons, 25, mod_name=ModNames.sve) +shiny_lunaloo = create_fish(SVEFish.shiny_lunaloo, 3070, ginger_island_ocean, season.all_seasons, 110, mod_name=ModNames.sve) +snatcher_worm = create_fish(SVEFish.snatcher_worm, 3075, mutant_bug_lair, season.all_seasons, 75, mod_name=ModNames.sve) +starfish = create_fish(SVEFish.starfish, 3079, ginger_island_ocean, season.all_seasons, 75, mod_name=ModNames.sve) +torpedo_trout = create_fish(SVEFish.torpedo_trout, 3084, fable_reef, season.all_seasons, 70, mod_name=ModNames.sve) +undeadfish = create_fish(SVEFish.undeadfish, 3085, crimson_badlands, season.all_seasons, 80, mod_name=ModNames.sve) +void_eel = create_fish(SVEFish.void_eel, 3087, witch_swamp, season.all_seasons, 100, mod_name=ModNames.sve) +water_grub = create_fish(SVEFish.water_grub, 3094, mutant_bug_lair, season.all_seasons, 60, mod_name=ModNames.sve) +sea_sponge = create_fish(SVEFish.sea_sponge, 3067, ginger_island_ocean, season.all_seasons, 40, mod_name=ModNames.sve) +dulse_seaweed = create_fish(SVEFish.dulse_seaweed, 3020, vineyard, season.all_seasons, 50, mod_name=ModNames.sve) + + clam = create_fish("Clam", 372, ocean, season.all_seasons, -1) cockle = create_fish("Cockle", 718, ocean, season.all_seasons, -1) crab = create_fish("Crab", 717, ocean, season.all_seasons, -1) @@ -138,3 +175,12 @@ def create_fish(name: str, item_id: int, locations: Tuple[str, ...], seasons: Un island_fish = [lionfish, blue_discus, stingray, *extended_family] all_fish_by_name = {fish.name: fish for fish in all_fish} + + +def get_fish_for_mods(mods: Set[str]) -> List[FishItem]: + fish_for_mods = [] + for fish in all_fish: + if fish.mod_name and fish.mod_name not in mods: + continue + fish_for_mods.append(fish) + return fish_for_mods diff --git a/worlds/stardew_valley/data/items.csv b/worlds/stardew_valley/data/items.csv index 528a15b5888..26934610f67 100644 --- a/worlds/stardew_valley/data/items.csv +++ b/worlds/stardew_valley/data/items.csv @@ -753,5 +753,35 @@ id,name,classification,groups,mod_name 10109,Delores <3,progression,FRIENDSANITY,Delores - Custom NPC 10110,Ayeisha <3,progression,FRIENDSANITY,Ayeisha - The Postal Worker (Custom NPC) 10111,Riley <3,progression,FRIENDSANITY,Custom NPC - Riley +10112,Claire <3,progression,FRIENDSANITY,Stardew Valley Expanded +10113,Lance <3,progression,"FRIENDSANITY,GINGER_ISLAND",Stardew Valley Expanded +10114,Olivia <3,progression,FRIENDSANITY,Stardew Valley Expanded +10115,Sophia <3,progression,FRIENDSANITY,Stardew Valley Expanded +10116,Victor <3,progression,FRIENDSANITY,Stardew Valley Expanded +10117,Andy <3,progression,FRIENDSANITY,Stardew Valley Expanded +10118,Apples <3,progression,FRIENDSANITY,Stardew Valley Expanded +10119,Gunther <3,progression,FRIENDSANITY,Stardew Valley Expanded +10120,Martin <3,progression,FRIENDSANITY,Stardew Valley Expanded +10121,Marlon <3,progression,FRIENDSANITY,Stardew Valley Expanded +10122,Morgan <3,progression,FRIENDSANITY,Stardew Valley Expanded +10123,Scarlett <3,progression,FRIENDSANITY,Stardew Valley Expanded +10124,Susan <3,progression,FRIENDSANITY,Stardew Valley Expanded +10125,Morris <3,progression,FRIENDSANITY,Stardew Valley Expanded 10301,Progressive Woods Obelisk Sigils,progression,,DeepWoods 10302,Progressive Skull Cavern Elevator,progression,,Skull Cavern Elevator +10501,Marlon's Boat Paddle,progression,GINGER_ISLAND,Stardew Valley Expanded +10502,Diamond Wand,filler,"WEAPON,DEPRECATED",Stardew Valley Expanded +10503,Iridium Bomb,progression,,Stardew Valley Expanded +10504,Krobus' Protection,useful,,Stardew Valley Expanded +10505,Kittyfish Spell,progression,,Stardew Valley Expanded +10506,Nexus: Adventurer's Guild Runes,progression,MOD_WARP,Stardew Valley Expanded +10507,Nexus: Junimo Woods Runes,progression,MOD_WARP,Stardew Valley Expanded +10508,Nexus: Aurora Vineyard Runes,progression,MOD_WARP,Stardew Valley Expanded +10509,Nexus: Sprite Spring Runes,progression,MOD_WARP,Stardew Valley Expanded +10510,Nexus: Outpost Runes,progression,MOD_WARP,Stardew Valley Expanded +10511,Fable Reef Portal,progression,"GINGER_ISLAND",Stardew Valley Expanded +10512,Super Starfruit,useful,,Stardew Valley Expanded +10513,Tempered Galaxy Sword,filler,"WEAPON,DEPRECATED",Stardew Valley Expanded +10514,Tempered Galaxy Dagger,filler,"WEAPON,DEPRECATED",Stardew Valley Expanded +10515,Tempered Galaxy Hammer,filler,"WEAPON,DEPRECATED",Stardew Valley Expanded +10516,Abandoned House Outskirts Clean-up,progression,MOD_WARP,Stardew Valley Expanded diff --git a/worlds/stardew_valley/data/locations.csv b/worlds/stardew_valley/data/locations.csv index 8bdd482146f..bcfd7af4ed4 100644 --- a/worlds/stardew_valley/data/locations.csv +++ b/worlds/stardew_valley/data/locations.csv @@ -2239,6 +2239,170 @@ id,region,name,tags,mod_name 6136,Town,Friendsanity: Riley 12 <3,FRIENDSANITY,Custom NPC - Riley 6137,Town,Friendsanity: Riley 13 <3,FRIENDSANITY,Custom NPC - Riley 6138,Town,Friendsanity: Riley 14 <3,FRIENDSANITY,Custom NPC - Riley +6139,JojaMart,Friendsanity: Claire 1 <3,FRIENDSANITY,Stardew Valley Expanded +6140,JojaMart,Friendsanity: Claire 2 <3,FRIENDSANITY,Stardew Valley Expanded +6141,JojaMart,Friendsanity: Claire 3 <3,FRIENDSANITY,Stardew Valley Expanded +6142,JojaMart,Friendsanity: Claire 4 <3,FRIENDSANITY,Stardew Valley Expanded +6143,JojaMart,Friendsanity: Claire 5 <3,FRIENDSANITY,Stardew Valley Expanded +6144,JojaMart,Friendsanity: Claire 6 <3,FRIENDSANITY,Stardew Valley Expanded +6145,JojaMart,Friendsanity: Claire 7 <3,FRIENDSANITY,Stardew Valley Expanded +6146,JojaMart,Friendsanity: Claire 8 <3,FRIENDSANITY,Stardew Valley Expanded +6147,JojaMart,Friendsanity: Claire 9 <3,FRIENDSANITY,Stardew Valley Expanded +6148,JojaMart,Friendsanity: Claire 10 <3,FRIENDSANITY,Stardew Valley Expanded +6149,JojaMart,Friendsanity: Claire 11 <3,FRIENDSANITY,Stardew Valley Expanded +6150,JojaMart,Friendsanity: Claire 12 <3,FRIENDSANITY,Stardew Valley Expanded +6151,JojaMart,Friendsanity: Claire 13 <3,FRIENDSANITY,Stardew Valley Expanded +6152,JojaMart,Friendsanity: Claire 14 <3,FRIENDSANITY,Stardew Valley Expanded +6153,Highlands,Friendsanity: Lance 1 <3,"FRIENDSANITY,GINGER_ISLAND",Stardew Valley Expanded +6154,Highlands,Friendsanity: Lance 2 <3,"FRIENDSANITY,GINGER_ISLAND",Stardew Valley Expanded +6155,Highlands,Friendsanity: Lance 3 <3,"FRIENDSANITY,GINGER_ISLAND",Stardew Valley Expanded +6156,Highlands,Friendsanity: Lance 4 <3,"FRIENDSANITY,GINGER_ISLAND",Stardew Valley Expanded +6157,Highlands,Friendsanity: Lance 5 <3,"FRIENDSANITY,GINGER_ISLAND",Stardew Valley Expanded +6158,Highlands,Friendsanity: Lance 6 <3,"FRIENDSANITY,GINGER_ISLAND",Stardew Valley Expanded +6159,Highlands,Friendsanity: Lance 7 <3,"FRIENDSANITY,GINGER_ISLAND",Stardew Valley Expanded +6160,Highlands,Friendsanity: Lance 8 <3,"FRIENDSANITY,GINGER_ISLAND",Stardew Valley Expanded +6161,Highlands,Friendsanity: Lance 9 <3,"FRIENDSANITY,GINGER_ISLAND",Stardew Valley Expanded +6162,Highlands,Friendsanity: Lance 10 <3,"FRIENDSANITY,GINGER_ISLAND",Stardew Valley Expanded +6163,Highlands,Friendsanity: Lance 11 <3,"FRIENDSANITY,GINGER_ISLAND",Stardew Valley Expanded +6164,Highlands,Friendsanity: Lance 12 <3,"FRIENDSANITY,GINGER_ISLAND",Stardew Valley Expanded +6165,Highlands,Friendsanity: Lance 13 <3,"FRIENDSANITY,GINGER_ISLAND",Stardew Valley Expanded +6166,Highlands,Friendsanity: Lance 14 <3,"FRIENDSANITY,GINGER_ISLAND",Stardew Valley Expanded +6167,Jenkins' Residence,Friendsanity: Olivia 1 <3,FRIENDSANITY,Stardew Valley Expanded +6168,Jenkins' Residence,Friendsanity: Olivia 2 <3,FRIENDSANITY,Stardew Valley Expanded +6169,Jenkins' Residence,Friendsanity: Olivia 3 <3,FRIENDSANITY,Stardew Valley Expanded +6170,Jenkins' Residence,Friendsanity: Olivia 4 <3,FRIENDSANITY,Stardew Valley Expanded +6171,Jenkins' Residence,Friendsanity: Olivia 5 <3,FRIENDSANITY,Stardew Valley Expanded +6172,Jenkins' Residence,Friendsanity: Olivia 6 <3,FRIENDSANITY,Stardew Valley Expanded +6173,Jenkins' Residence,Friendsanity: Olivia 7 <3,FRIENDSANITY,Stardew Valley Expanded +6174,Jenkins' Residence,Friendsanity: Olivia 8 <3,FRIENDSANITY,Stardew Valley Expanded +6175,Jenkins' Residence,Friendsanity: Olivia 9 <3,FRIENDSANITY,Stardew Valley Expanded +6176,Jenkins' Residence,Friendsanity: Olivia 10 <3,FRIENDSANITY,Stardew Valley Expanded +6177,Jenkins' Residence,Friendsanity: Olivia 11 <3,FRIENDSANITY,Stardew Valley Expanded +6178,Jenkins' Residence,Friendsanity: Olivia 12 <3,FRIENDSANITY,Stardew Valley Expanded +6179,Jenkins' Residence,Friendsanity: Olivia 13 <3,FRIENDSANITY,Stardew Valley Expanded +6180,Jenkins' Residence,Friendsanity: Olivia 14 <3,FRIENDSANITY,Stardew Valley Expanded +6181,Forest,Friendsanity: Wizard 11 <3,FRIENDSANITY,Stardew Valley Expanded +6182,Forest,Friendsanity: Wizard 12 <3,FRIENDSANITY,Stardew Valley Expanded +6183,Forest,Friendsanity: Wizard 13 <3,FRIENDSANITY,Stardew Valley Expanded +6184,Forest,Friendsanity: Wizard 14 <3,FRIENDSANITY,Stardew Valley Expanded +6185,Blue Moon Vineyard,Friendsanity: Sophia 1 <3,FRIENDSANITY,Stardew Valley Expanded +6186,Blue Moon Vineyard,Friendsanity: Sophia 2 <3,FRIENDSANITY,Stardew Valley Expanded +6187,Blue Moon Vineyard,Friendsanity: Sophia 3 <3,FRIENDSANITY,Stardew Valley Expanded +6188,Blue Moon Vineyard,Friendsanity: Sophia 4 <3,FRIENDSANITY,Stardew Valley Expanded +6189,Blue Moon Vineyard,Friendsanity: Sophia 5 <3,FRIENDSANITY,Stardew Valley Expanded +6190,Blue Moon Vineyard,Friendsanity: Sophia 6 <3,FRIENDSANITY,Stardew Valley Expanded +6191,Blue Moon Vineyard,Friendsanity: Sophia 7 <3,FRIENDSANITY,Stardew Valley Expanded +6192,Blue Moon Vineyard,Friendsanity: Sophia 8 <3,FRIENDSANITY,Stardew Valley Expanded +6193,Blue Moon Vineyard,Friendsanity: Sophia 9 <3,FRIENDSANITY,Stardew Valley Expanded +6194,Blue Moon Vineyard,Friendsanity: Sophia 10 <3,FRIENDSANITY,Stardew Valley Expanded +6195,Blue Moon Vineyard,Friendsanity: Sophia 11 <3,FRIENDSANITY,Stardew Valley Expanded +6196,Blue Moon Vineyard,Friendsanity: Sophia 12 <3,FRIENDSANITY,Stardew Valley Expanded +6197,Blue Moon Vineyard,Friendsanity: Sophia 13 <3,FRIENDSANITY,Stardew Valley Expanded +6198,Blue Moon Vineyard,Friendsanity: Sophia 14 <3,FRIENDSANITY,Stardew Valley Expanded +6199,Jenkins' Residence,Friendsanity: Victor 1 <3,FRIENDSANITY,Stardew Valley Expanded +6200,Jenkins' Residence,Friendsanity: Victor 2 <3,FRIENDSANITY,Stardew Valley Expanded +6201,Jenkins' Residence,Friendsanity: Victor 3 <3,FRIENDSANITY,Stardew Valley Expanded +6202,Jenkins' Residence,Friendsanity: Victor 4 <3,FRIENDSANITY,Stardew Valley Expanded +6203,Jenkins' Residence,Friendsanity: Victor 5 <3,FRIENDSANITY,Stardew Valley Expanded +6204,Jenkins' Residence,Friendsanity: Victor 6 <3,FRIENDSANITY,Stardew Valley Expanded +6205,Jenkins' Residence,Friendsanity: Victor 7 <3,FRIENDSANITY,Stardew Valley Expanded +6206,Jenkins' Residence,Friendsanity: Victor 8 <3,FRIENDSANITY,Stardew Valley Expanded +6207,Jenkins' Residence,Friendsanity: Victor 9 <3,FRIENDSANITY,Stardew Valley Expanded +6208,Jenkins' Residence,Friendsanity: Victor 10 <3,FRIENDSANITY,Stardew Valley Expanded +6209,Jenkins' Residence,Friendsanity: Victor 11 <3,FRIENDSANITY,Stardew Valley Expanded +6210,Jenkins' Residence,Friendsanity: Victor 12 <3,FRIENDSANITY,Stardew Valley Expanded +6211,Jenkins' Residence,Friendsanity: Victor 13 <3,FRIENDSANITY,Stardew Valley Expanded +6212,Jenkins' Residence,Friendsanity: Victor 14 <3,FRIENDSANITY,Stardew Valley Expanded +6213,Forest,Friendsanity: Andy 1 <3,FRIENDSANITY,Stardew Valley Expanded +6214,Forest,Friendsanity: Andy 2 <3,FRIENDSANITY,Stardew Valley Expanded +6215,Forest,Friendsanity: Andy 3 <3,FRIENDSANITY,Stardew Valley Expanded +6216,Forest,Friendsanity: Andy 4 <3,FRIENDSANITY,Stardew Valley Expanded +6217,Forest,Friendsanity: Andy 5 <3,FRIENDSANITY,Stardew Valley Expanded +6218,Forest,Friendsanity: Andy 6 <3,FRIENDSANITY,Stardew Valley Expanded +6219,Forest,Friendsanity: Andy 7 <3,FRIENDSANITY,Stardew Valley Expanded +6220,Forest,Friendsanity: Andy 8 <3,FRIENDSANITY,Stardew Valley Expanded +6221,Forest,Friendsanity: Andy 9 <3,FRIENDSANITY,Stardew Valley Expanded +6222,Forest,Friendsanity: Andy 10 <3,FRIENDSANITY,Stardew Valley Expanded +6223,Aurora Vineyard,Friendsanity: Apples 1 <3,FRIENDSANITY,Stardew Valley Expanded +6224,Aurora Vineyard,Friendsanity: Apples 2 <3,FRIENDSANITY,Stardew Valley Expanded +6225,Aurora Vineyard,Friendsanity: Apples 3 <3,FRIENDSANITY,Stardew Valley Expanded +6226,Aurora Vineyard,Friendsanity: Apples 4 <3,FRIENDSANITY,Stardew Valley Expanded +6227,Aurora Vineyard,Friendsanity: Apples 5 <3,FRIENDSANITY,Stardew Valley Expanded +6228,Aurora Vineyard,Friendsanity: Apples 6 <3,FRIENDSANITY,Stardew Valley Expanded +6229,Aurora Vineyard,Friendsanity: Apples 7 <3,FRIENDSANITY,Stardew Valley Expanded +6230,Aurora Vineyard,Friendsanity: Apples 8 <3,FRIENDSANITY,Stardew Valley Expanded +6231,Aurora Vineyard,Friendsanity: Apples 9 <3,FRIENDSANITY,Stardew Valley Expanded +6232,Aurora Vineyard,Friendsanity: Apples 10 <3,FRIENDSANITY,Stardew Valley Expanded +6233,Museum,Friendsanity: Gunther 1 <3,FRIENDSANITY,Stardew Valley Expanded +6234,Museum,Friendsanity: Gunther 2 <3,FRIENDSANITY,Stardew Valley Expanded +6235,Museum,Friendsanity: Gunther 3 <3,FRIENDSANITY,Stardew Valley Expanded +6236,Museum,Friendsanity: Gunther 4 <3,FRIENDSANITY,Stardew Valley Expanded +6237,Museum,Friendsanity: Gunther 5 <3,FRIENDSANITY,Stardew Valley Expanded +6238,Museum,Friendsanity: Gunther 6 <3,FRIENDSANITY,Stardew Valley Expanded +6239,Museum,Friendsanity: Gunther 7 <3,FRIENDSANITY,Stardew Valley Expanded +6240,Museum,Friendsanity: Gunther 8 <3,FRIENDSANITY,Stardew Valley Expanded +6241,Museum,Friendsanity: Gunther 9 <3,FRIENDSANITY,Stardew Valley Expanded +6242,Museum,Friendsanity: Gunther 10 <3,FRIENDSANITY,Stardew Valley Expanded +6243,JojaMart,Friendsanity: Martin 1 <3,FRIENDSANITY,Stardew Valley Expanded +6244,JojaMart,Friendsanity: Martin 2 <3,FRIENDSANITY,Stardew Valley Expanded +6245,JojaMart,Friendsanity: Martin 3 <3,FRIENDSANITY,Stardew Valley Expanded +6246,JojaMart,Friendsanity: Martin 4 <3,FRIENDSANITY,Stardew Valley Expanded +6247,JojaMart,Friendsanity: Martin 5 <3,FRIENDSANITY,Stardew Valley Expanded +6248,JojaMart,Friendsanity: Martin 6 <3,FRIENDSANITY,Stardew Valley Expanded +6249,JojaMart,Friendsanity: Martin 7 <3,FRIENDSANITY,Stardew Valley Expanded +6250,JojaMart,Friendsanity: Martin 8 <3,FRIENDSANITY,Stardew Valley Expanded +6251,JojaMart,Friendsanity: Martin 9 <3,FRIENDSANITY,Stardew Valley Expanded +6252,JojaMart,Friendsanity: Martin 10 <3,FRIENDSANITY,Stardew Valley Expanded +6253,Adventurer's Guild,Friendsanity: Marlon 1 <3,FRIENDSANITY,Stardew Valley Expanded +6254,Adventurer's Guild,Friendsanity: Marlon 2 <3,FRIENDSANITY,Stardew Valley Expanded +6255,Adventurer's Guild,Friendsanity: Marlon 3 <3,FRIENDSANITY,Stardew Valley Expanded +6256,Adventurer's Guild,Friendsanity: Marlon 4 <3,FRIENDSANITY,Stardew Valley Expanded +6257,Adventurer's Guild,Friendsanity: Marlon 5 <3,FRIENDSANITY,Stardew Valley Expanded +6258,Adventurer's Guild,Friendsanity: Marlon 6 <3,FRIENDSANITY,Stardew Valley Expanded +6259,Adventurer's Guild,Friendsanity: Marlon 7 <3,FRIENDSANITY,Stardew Valley Expanded +6260,Adventurer's Guild,Friendsanity: Marlon 8 <3,FRIENDSANITY,Stardew Valley Expanded +6261,Adventurer's Guild,Friendsanity: Marlon 9 <3,FRIENDSANITY,Stardew Valley Expanded +6262,Adventurer's Guild,Friendsanity: Marlon 10 <3,FRIENDSANITY,Stardew Valley Expanded +6263,Wizard Tower,Friendsanity: Morgan 1 <3,FRIENDSANITY,Stardew Valley Expanded +6264,Wizard Tower,Friendsanity: Morgan 2 <3,FRIENDSANITY,Stardew Valley Expanded +6265,Wizard Tower,Friendsanity: Morgan 3 <3,FRIENDSANITY,Stardew Valley Expanded +6266,Wizard Tower,Friendsanity: Morgan 4 <3,FRIENDSANITY,Stardew Valley Expanded +6267,Wizard Tower,Friendsanity: Morgan 5 <3,FRIENDSANITY,Stardew Valley Expanded +6268,Wizard Tower,Friendsanity: Morgan 6 <3,FRIENDSANITY,Stardew Valley Expanded +6269,Wizard Tower,Friendsanity: Morgan 7 <3,FRIENDSANITY,Stardew Valley Expanded +6270,Wizard Tower,Friendsanity: Morgan 8 <3,FRIENDSANITY,Stardew Valley Expanded +6271,Wizard Tower,Friendsanity: Morgan 9 <3,FRIENDSANITY,Stardew Valley Expanded +6272,Wizard Tower,Friendsanity: Morgan 10 <3,FRIENDSANITY,Stardew Valley Expanded +6273,Blue Moon Vineyard,Friendsanity: Scarlett 1 <3,FRIENDSANITY,Stardew Valley Expanded +6274,Blue Moon Vineyard,Friendsanity: Scarlett 2 <3,FRIENDSANITY,Stardew Valley Expanded +6275,Blue Moon Vineyard,Friendsanity: Scarlett 3 <3,FRIENDSANITY,Stardew Valley Expanded +6276,Blue Moon Vineyard,Friendsanity: Scarlett 4 <3,FRIENDSANITY,Stardew Valley Expanded +6277,Blue Moon Vineyard,Friendsanity: Scarlett 5 <3,FRIENDSANITY,Stardew Valley Expanded +6278,Blue Moon Vineyard,Friendsanity: Scarlett 6 <3,FRIENDSANITY,Stardew Valley Expanded +6279,Blue Moon Vineyard,Friendsanity: Scarlett 7 <3,FRIENDSANITY,Stardew Valley Expanded +6280,Blue Moon Vineyard,Friendsanity: Scarlett 8 <3,FRIENDSANITY,Stardew Valley Expanded +6281,Blue Moon Vineyard,Friendsanity: Scarlett 9 <3,FRIENDSANITY,Stardew Valley Expanded +6282,Blue Moon Vineyard,Friendsanity: Scarlett 10 <3,FRIENDSANITY,Stardew Valley Expanded +6283,Railroad,Friendsanity: Susan 1 <3,FRIENDSANITY,Stardew Valley Expanded +6284,Railroad,Friendsanity: Susan 2 <3,FRIENDSANITY,Stardew Valley Expanded +6285,Railroad,Friendsanity: Susan 3 <3,FRIENDSANITY,Stardew Valley Expanded +6286,Railroad,Friendsanity: Susan 4 <3,FRIENDSANITY,Stardew Valley Expanded +6287,Railroad,Friendsanity: Susan 5 <3,FRIENDSANITY,Stardew Valley Expanded +6288,Railroad,Friendsanity: Susan 6 <3,FRIENDSANITY,Stardew Valley Expanded +6289,Railroad,Friendsanity: Susan 7 <3,FRIENDSANITY,Stardew Valley Expanded +6290,Railroad,Friendsanity: Susan 8 <3,FRIENDSANITY,Stardew Valley Expanded +6291,Railroad,Friendsanity: Susan 9 <3,FRIENDSANITY,Stardew Valley Expanded +6292,Railroad,Friendsanity: Susan 10 <3,FRIENDSANITY,Stardew Valley Expanded +6293,JojaMart,Friendsanity: Morris 1 <3,FRIENDSANITY,Stardew Valley Expanded +6294,JojaMart,Friendsanity: Morris 2 <3,FRIENDSANITY,Stardew Valley Expanded +6295,JojaMart,Friendsanity: Morris 3 <3,FRIENDSANITY,Stardew Valley Expanded +6296,JojaMart,Friendsanity: Morris 4 <3,FRIENDSANITY,Stardew Valley Expanded +6297,JojaMart,Friendsanity: Morris 5 <3,FRIENDSANITY,Stardew Valley Expanded +6298,JojaMart,Friendsanity: Morris 6 <3,FRIENDSANITY,Stardew Valley Expanded +6299,JojaMart,Friendsanity: Morris 7 <3,FRIENDSANITY,Stardew Valley Expanded +6300,JojaMart,Friendsanity: Morris 8 <3,FRIENDSANITY,Stardew Valley Expanded +6301,JojaMart,Friendsanity: Morris 9 <3,FRIENDSANITY,Stardew Valley Expanded +6302,JojaMart,Friendsanity: Morris 10 <3,FRIENDSANITY,Stardew Valley Expanded 7001,Pierre's General Store,Premium Pack,BACKPACK,Bigger Backpack 7002,Carpenter Shop,Tractor Garage Blueprint,BUILDING_BLUEPRINT,Tractor Mod 7003,The Deep Woods Depth 100,Pet the Deep Woods Unicorn,MANDATORY,DeepWoods @@ -2272,3 +2436,43 @@ id,region,name,tags,mod_name 7504,Forest,Juna's Drink Request,"MANDATORY,QUEST",Juna - Roommate NPC 7505,Forest,Juna's BFF Request,"MANDATORY,QUEST",Juna - Roommate NPC 7506,Forest,Juna's Monster Mash,SPECIAL_ORDER_BOARD,Juna - Roommate NPC +7507,Adventurer's Guild,Marlon's Boat,"MANDATORY,QUEST,GINGER_ISLAND",Stardew Valley Expanded +7508,Railroad,The Railroad Boulder,"MANDATORY,QUEST",Stardew Valley Expanded +7509,Grandpa's Shed Interior,Grandpa's Shed,"MANDATORY,QUEST",Stardew Valley Expanded +7510,Aurora Vineyard,Aurora Vineyard,"MANDATORY,QUEST",Stardew Valley Expanded +7511,Adventurer's Guild,Monster Crops,"MANDATORY,QUEST,GINGER_ISLAND",Stardew Valley Expanded +7512,Sewer,Void Soul,"MANDATORY,QUEST",Stardew Valley Expanded +7601,Bear Shop,Bear: Baked Berry Oatmeal Recipe,MANDATORY,Stardew Valley Expanded +7602,Bear Shop,Bear: Flower Cookie Recipe,MANDATORY,Stardew Valley Expanded +7603,Purple Junimo Shop,Purple Junimo: Super Starfruit,MANDATORY,Stardew Valley Expanded +7604,Alesia Shop,Alesia: Tempered Galaxy Dagger,MANDATORY,Stardew Valley Expanded +7605,Issac Shop,Issac: Tempered Galaxy Sword,MANDATORY,Stardew Valley Expanded +7606,Issac Shop,Issac: Tempered Galaxy Hammer,MANDATORY,Stardew Valley Expanded +7607,Highlands,Lance's Diamond Wand,"MANDATORY,GINGER_ISLAND",Stardew Valley Expanded +7501,Island South,Fishsanity: Baby Lunaloo,"FISHSANITY,GINGER_ISLAND",Stardew Valley Expanded +7502,Crimson Badlands,Fishsanity: Bonefish,FISHSANITY,Stardew Valley Expanded +7503,Forest,Fishsanity: Bull Trout,FISHSANITY,Stardew Valley Expanded +7504,Forest West,Fishsanity: Butterfish,FISHSANITY,Stardew Valley Expanded +7505,Island South,Fishsanity: Clownfish,"FISHSANITY,GINGER_ISLAND",Stardew Valley Expanded +7506,Highlands,Fishsanity: Daggerfish,"FISHSANITY,GINGER_ISLAND",Stardew Valley Expanded +7507,Mountain,Fishsanity: Frog,FISHSANITY,Stardew Valley Expanded +7508,Highlands,Fishsanity: Gemfish,"FISHSANITY,GINGER_ISLAND",Stardew Valley Expanded +8001,Sprite Spring,Fishsanity: Goldenfish,FISHSANITY,Stardew Valley Expanded +8002,Secret Woods,Fishsanity: Grass Carp,FISHSANITY,Stardew Valley Expanded +8003,Forest West,Fishsanity: King Salmon,FISHSANITY,Stardew Valley Expanded +8004,Island West,Fishsanity: Lunaloo,"FISHSANITY,GINGER_ISLAND",Stardew Valley Expanded +8005,Sprite Spring,Fishsanity: Meteor Carp,FISHSANITY,Stardew Valley Expanded +8006,Town,Fishsanity: Minnow,FISHSANITY,Stardew Valley Expanded +8007,Forest West,Fishsanity: Puppyfish,FISHSANITY,Stardew Valley Expanded +8008,Sewer,Fishsanity: Radioactive Bass,FISHSANITY,Stardew Valley Expanded +8009,Island West,Fishsanity: Seahorse,"FISHSANITY,GINGER_ISLAND",Stardew Valley Expanded +8010,Island West,Fishsanity: Sea Sponge,"FISHSANITY,GINGER_ISLAND",Stardew Valley Expanded +8011,Island South,Fishsanity: Shiny Lunaloo,"FISHSANITY,GINGER_ISLAND",Stardew Valley Expanded +8012,Mutant Bug Lair,Fishsanity: Snatcher Worm,FISHSANITY,Stardew Valley Expanded +8013,Beach,Fishsanity: Starfish,FISHSANITY,Stardew Valley Expanded +8014,Fable Reef,Fishsanity: Torpedo Trout,"FISHSANITY,GINGER_ISLAND",Stardew Valley Expanded +8015,Witch's Swamp,Fishsanity: Void Eel,FISHSANITY,Stardew Valley Expanded +8016,Mutant Bug Lair,Fishsanity: Water Grub,FISHSANITY,Stardew Valley Expanded +8017,Crimson Badlands,Fishsanity: Undeadfish,FISHSANITY,Stardew Valley Expanded +8018,Shearwater Bridge,Fishsanity: Kittyfish,FISHSANITY,Stardew Valley Expanded +8019,Blue Moon Vineyard,Fishsanity: Dulse Seaweed,FISHSANITY,Stardew Valley Expanded diff --git a/worlds/stardew_valley/data/recipe_data.py b/worlds/stardew_valley/data/recipe_data.py index a0e34046a92..77d32ff9138 100644 --- a/worlds/stardew_valley/data/recipe_data.py +++ b/worlds/stardew_valley/data/recipe_data.py @@ -86,7 +86,7 @@ def create_recipe(name: str, ingredients: Dict[str, int], source: RecipeSource) cheese_cauliflower = friendship_recipe(Meal.cheese_cauliflower, NPC.pam, 3, {Vegetable.cauliflower: 1, ArtisanGood.cheese: 1}) chocolate_cake_ingredients = {Ingredient.wheat_flour: 1, Ingredient.sugar: 1, AnimalProduct.chicken_egg: 1} chocolate_cake_qos = queen_of_sauce_recipe(Meal.chocolate_cake, 1, Season.winter, 14, chocolate_cake_ingredients) -chowder = friendship_recipe(Meal.chowder, NPC.willy, 3, {WaterItem.clam: 1, AnimalProduct.cow_milk: 1}) +chowder = friendship_recipe(Meal.chowder, NPC.willy, 3, {Fish.clam: 1, AnimalProduct.cow_milk: 1}) coleslaw = queen_of_sauce_recipe(Meal.coleslaw, 14, Season.spring, 14, {Vegetable.red_cabbage: 1, Ingredient.vinegar: 1, ArtisanGood.mayonnaise: 1}) complete_breakfast_ingredients = {Meal.fried_egg: 1, AnimalProduct.milk: 1, Meal.hashbrowns: 1, Meal.pancakes: 1} complete_breakfast = queen_of_sauce_recipe(Meal.complete_breakfast, 2, Season.spring, 21, complete_breakfast_ingredients) diff --git a/worlds/stardew_valley/data/villagers_data.py b/worlds/stardew_valley/data/villagers_data.py index c357e35ce84..7d2299be281 100644 --- a/worlds/stardew_valley/data/villagers_data.py +++ b/worlds/stardew_valley/data/villagers_data.py @@ -1,8 +1,8 @@ from dataclasses import dataclass -from typing import List, Tuple, Optional, Dict +from typing import List, Tuple, Optional, Dict, Callable, Set from ..strings.food_names import Beverage -from ..strings.region_names import Region +from ..strings.region_names import Region, SVERegion from ..mods.mod_data import ModNames from ..strings.season_names import Season from ..strings.villager_names import NPC, ModNPC @@ -16,7 +16,7 @@ class Villager: birthday: str gifts: Tuple[str] available: bool - mod_name: Optional[str] + mod_name: str def __repr__(self): return f"{self.name} [Bachelor: {self.bachelor}] [Available from start: {self.available}]" \ @@ -43,6 +43,16 @@ def __repr__(self): secret_woods = (Region.secret_woods,) wizard_tower = (Region.wizard_tower,) +# Stardew Valley Expanded Locations +adventurer = (Region.adventurer_guild,) +highlands = (SVERegion.highlands,) +bluemoon = (SVERegion.blue_moon_vineyard,) +aurora = (SVERegion.aurora_vineyard,) +museum = (Region.museum,) +jojamart = (Region.jojamart,) +railroad = (Region.railroad,) +junimo = (SVERegion.junimo_woods,) + golden_pumpkin = ("Golden Pumpkin",) # magic_rock_candy = ("Magic Rock Candy",) pearl = ("Pearl",) @@ -273,8 +283,72 @@ def __repr__(self): juna_loves = ancient_doll + elvish_jewelry + dinosaur_egg + strange_doll + joja_cola + hashbrowns + pancakes + \ pink_cake + jelly + ghost_crystal + prehistoric_scapula + cherry +glazed_butterfish = ("Glazed Butterfish",) +aged_blue_moon_wine = ("Aged Blue Moon Wine",) +blue_moon_wine = ("Blue Moon Wine",) +daggerfish = ("Daggerfish",) +gemfish = ("Gemfish",) +green_mushroom = ("Green Mushroom",) +monster_mushroom = ("Monster Mushroom",) +swirl_stone = ("Swirl Stone",) +torpedo_trout = ("Torpedo Trout",) +void_shard = ("Void Shard",) +ornate_treasure_chest = ("Ornate Treasure Chest",) +frog_legs = ("Frog Legs",) +void_delight = ("Void Delight",) +void_pebble = ("Void Pebble",) +void_salmon_sushi = ("Void Salmon Sushi",) +puppyfish = ("Puppyfish",) +butterfish = ("Butterfish",) +king_salmon = ("King Salmon",) +frog = ("Frog",) +kittyfish = ("Kittyfish",) +big_bark_burger = ("Big Bark Burger",) +starfruit = ("Starfruit",) +bruschetta = ("Brushetta",) +apricot = ("Apricot",) +ocean_stone = ("Ocean Stone",) +fairy_stone = ("Fairy Stone",) +lunarite = ("Lunarite",) +bean_hotpot = ("Bean Hotpot",) +petrified_slime = ("Petrified Slime",) +ornamental_fan = ("Ornamental Fan",) +ancient_sword = ("Ancient Sword",) +star_shards = ("Star Shards",) +life_elixir = ("Life Elixir",) +juice = ("Juice",) +lobster_bisque = ("Lobster Bisque",) +chowder = ("Chowder",) +goat_milk = ("Goat Milk",) +maple_syrup = ("Maple Syrup",) +cookie = ("Cookie",) +blueberry_tart = ("Blueberry Tart",) + +claire_loves = green_tea + sunflower + energy_tonic + bruschetta + apricot + ocean_stone + glazed_butterfish +lance_loves = aged_blue_moon_wine + daggerfish + gemfish + golden_pumpkin + \ + green_mushroom + monster_mushroom + swirl_stone + torpedo_trout + tropical_curry + void_shard + \ + ornate_treasure_chest +olivia_loves = wine + chocolate_cake + pink_cake + golden_mask + golden_relic + \ + blue_moon_wine + aged_blue_moon_wine +sophia_loves = fairy_rose + fairy_stone + puppyfish +victor_loves = spaghetti + battery_pack + duck_feather + lunarite + \ + aged_blue_moon_wine + blue_moon_wine + butterfish +andy_loves = pearl + beer + mead + pale_ale + farmers_lunch + glazed_butterfish + butterfish + \ + king_salmon + blackberry_cobbler +gunther_loves = bean_hotpot + petrified_slime + salmon_dinner + elvish_jewelry + ornamental_fan + \ + dinosaur_egg + rare_disc + ancient_sword + dwarvish_helm + dwarf_gadget + golden_mask + golden_relic + \ + star_shards +marlon_loves = roots_platter + life_elixir + aged_blue_moon_wine + void_delight +martin_loves = juice + ice_cream + big_bark_burger +morgan_loves = iridium_bar + void_egg + void_mayonnaise + frog + kittyfish +morris_loves = lobster_bisque + chowder + truffle_oil + star_shards + aged_blue_moon_wine +scarlett_loves = goat_cheese + duck_feather + goat_milk + cherry + maple_syrup + honey + \ + chocolate_cake + pink_cake + jade + glazed_yams # actually large milk but meh +susan_loves = pancakes + chocolate_cake + pink_cake + ice_cream + cookie + pumpkin_pie + rhubarb_pie + \ + blueberry_tart + blackberry_cobbler + cranberry_candy + red_plate all_villagers: List[Villager] = [] +villager_modifications_by_mod: Dict[str, Dict[str, Callable[[str, Villager], Villager]]] = {} def villager(name: str, bachelor: bool, locations: Tuple[str, ...], birthday: str, gifts: Tuple[str, ...], @@ -284,6 +358,18 @@ def villager(name: str, bachelor: bool, locations: Tuple[str, ...], birthday: st return npc +def make_bachelor(mod_name: str, npc: Villager): + if npc.mod_name: + mod_name = npc.mod_name + return Villager(npc.name, True, npc.locations, npc.birthday, npc.gifts, npc.available, mod_name) + + +def register_villager_modification(mod_name: str, npc: Villager, modification_function): + if mod_name not in villager_modifications_by_mod: + villager_modifications_by_mod[mod_name] = {} + villager_modifications_by_mod[mod_name][npc.name] = modification_function + + josh = villager(NPC.alex, True, town + alex_house, Season.summer, universal_loves + complete_breakfast + salmon_dinner, True) elliott = villager(NPC.elliott, True, town + beach + elliott_house, Season.fall, universal_loves + elliott_loves, True) harvey = villager(NPC.harvey, True, town + hospital, Season.winter, universal_loves + harvey_loves, True) @@ -332,9 +418,30 @@ def villager(name: str, bachelor: bool, locations: Tuple[str, ...], birthday: st yoba = villager(ModNPC.yoba, False, secret_woods, Season.spring, universal_loves + yoba_loves, False, ModNames.yoba) riley = villager(ModNPC.riley, True, town, Season.spring, universal_loves, True, ModNames.riley) +# SVE Villagers +claire = villager(ModNPC.claire, True, town + jojamart, Season.fall, universal_loves + claire_loves, True, ModNames.sve) +lance = villager(ModNPC.lance, True, adventurer + highlands + island, Season.spring, lance_loves, False, ModNames.sve) +mommy = villager(ModNPC.olivia, True, town, Season.spring, universal_loves_no_rabbit_foot + olivia_loves, True, ModNames.sve) +sophia = villager(ModNPC.sophia, True, bluemoon, Season.winter, universal_loves_no_rabbit_foot + sophia_loves, True, ModNames.sve) +victor = villager(ModNPC.victor, True, town, Season.summer, universal_loves + victor_loves, True, ModNames.sve) +andy = villager(ModNPC.andy, False, forest, Season.spring, universal_loves + andy_loves, True, ModNames.sve) +apples = villager(ModNPC.apples, False, aurora + junimo, Season.spring, starfruit, False, ModNames.sve) +gunther = villager(ModNPC.gunther, False, museum, Season.winter, universal_loves + gunther_loves, True, ModNames.sve) +martin = villager(ModNPC.martin, False, town + jojamart, Season.summer, universal_loves + martin_loves, True, ModNames.sve) +marlon = villager(ModNPC.marlon, False, adventurer, Season.winter, universal_loves + marlon_loves, False, ModNames.sve) +morgan = villager(ModNPC.morgan, False, forest, Season.fall, universal_loves_no_rabbit_foot + morgan_loves, False, ModNames.sve) +scarlett = villager(ModNPC.scarlett, False, bluemoon, Season.summer, universal_loves + scarlett_loves, False, ModNames.sve) +susan = villager(ModNPC.susan, False, railroad, Season.fall, universal_loves + susan_loves, False, ModNames.sve) +morris = villager(ModNPC.morris, False, jojamart, Season.spring, universal_loves + morris_loves, True, ModNames.sve) + +# Modified villagers; not included in all villagers + +register_villager_modification(ModNames.sve, wizard, make_bachelor) + all_villagers_by_name: Dict[str, Villager] = {villager.name: villager for villager in all_villagers} all_villagers_by_mod: Dict[str, List[Villager]] = {} all_villagers_by_mod_by_name: Dict[str, Dict[str, Villager]] = {} + for npc in all_villagers: mod = npc.mod_name name = npc.name @@ -346,3 +453,19 @@ def villager(name: str, bachelor: bool, locations: Tuple[str, ...], birthday: st all_villagers_by_mod_by_name[mod] = {} all_villagers_by_mod_by_name[mod][name] = npc + +def get_villagers_for_mods(mods: Set[str]) -> List[Villager]: + villagers_for_current_mods = [] + for npc in all_villagers: + if npc.mod_name and npc.mod_name not in mods: + continue + modified_npc = npc + for active_mod in mods: + if (active_mod not in villager_modifications_by_mod or + npc.name not in villager_modifications_by_mod[active_mod]): + continue + modification = villager_modifications_by_mod[active_mod][npc.name] + modified_npc = modification(active_mod, modified_npc) + villagers_for_current_mods.append(modified_npc) + return villagers_for_current_mods + diff --git a/worlds/stardew_valley/items.py b/worlds/stardew_valley/items.py index 951cfeb029c..8f76b627288 100644 --- a/worlds/stardew_valley/items.py +++ b/worlds/stardew_valley/items.py @@ -8,7 +8,7 @@ from BaseClasses import Item, ItemClassification from . import data -from .data.villagers_data import all_villagers +from .data.villagers_data import get_villagers_for_mods from .mods.mod_data import ModNames from .options import StardewValleyOptions, TrapItems, FestivalLocations, ExcludeGingerIsland, SpecialOrderLocations, SeasonRandomization, Cropsanity, \ Friendsanity, Museumsanity, \ @@ -17,6 +17,7 @@ from .strings.ap_names.ap_weapon_names import APWeapon from .strings.ap_names.buff_names import Buff from .strings.ap_names.event_names import Event +from .strings.villager_names import NPC, ModNPC ITEM_CODE_OFFSET = 717000 @@ -78,7 +79,7 @@ class Group(enum.Enum): CRAFTSANITY = enum.auto() # Mods MAGIC_SPELL = enum.auto() - + MOD_WARP = enum.auto() @dataclass(frozen=True) class ItemData: @@ -193,7 +194,7 @@ def create_unique_items(item_factory: StardewItemFactory, options: StardewValley items.append(item_factory("Beach Bridge")) items.append(item_factory("Dark Talisman")) create_tv_channels(item_factory, items) - create_special_quest_rewards(item_factory, items) + create_special_quest_rewards(item_factory, options, items) create_stardrops(item_factory, options, items) create_museum_items(item_factory, options, items) create_arcade_machine_items(item_factory, options, items) @@ -319,13 +320,15 @@ def create_carpenter_buildings(item_factory: StardewItemFactory, options: Starde items.append(item_factory("Tractor Garage")) -def create_special_quest_rewards(item_factory: StardewItemFactory, items: List[Item]): +def create_special_quest_rewards(item_factory: StardewItemFactory, options: StardewValleyOptions, items: List[Item]): items.append(item_factory("Adventurer's Guild")) items.append(item_factory("Club Card")) items.append(item_factory("Magnifying Glass")) items.append(item_factory("Bear's Knowledge")) items.append(item_factory("Iridium Snake Milk")) items.append(item_factory("Fairy Dust Recipe")) + if ModNames.sve in options.mods: + create_special_quest_rewards_sve(item_factory, options, items) def create_stardrops(item_factory: StardewItemFactory, options: StardewValleyOptions, items: List[Item]): @@ -351,6 +354,7 @@ def create_museum_items(item_factory: StardewItemFactory, options: StardewValley def create_friendsanity_items(item_factory: StardewItemFactory, options: StardewValleyOptions, items: List[Item], random): + island_villagers = [NPC.leo, ModNPC.lance] if options.friendsanity == Friendsanity.option_none: return exclude_non_bachelors = options.friendsanity == Friendsanity.option_bachelors @@ -360,14 +364,12 @@ def create_friendsanity_items(item_factory: StardewItemFactory, options: Stardew exclude_ginger_island = options.exclude_ginger_island == ExcludeGingerIsland.option_true mods = options.mods heart_size = options.friendsanity_heart_size - for villager in all_villagers: - if villager.mod_name not in mods and villager.mod_name is not None: - continue + for villager in get_villagers_for_mods(mods.value): if not villager.available and exclude_locked_villagers: continue if not villager.bachelor and exclude_non_bachelors: continue - if villager.name == "Leo" and exclude_ginger_island: + if villager.name in island_villagers and exclude_ginger_island: continue heart_cap = 8 if villager.bachelor else 10 if include_post_marriage_hearts and villager.bachelor: @@ -552,6 +554,21 @@ def create_magic_mod_spells(item_factory: StardewItemFactory, options: StardewVa items.extend([item_factory(item) for item in items_by_group[Group.MAGIC_SPELL]]) +def create_special_quest_rewards_sve(item_factory: StardewItemFactory, options: StardewValleyOptions, items: List[Item]): + exclude_ginger_island = options.exclude_ginger_island == ExcludeGingerIsland.option_true + if ModNames.sve not in options.mods: + return [] + items.append(item_factory("Iridium Bomb")) + items.append(item_factory("Krobus' Protection")) + items.append(item_factory("Kittyfish Spell")) + items.extend([item_factory(item) for item in items_by_group[Group.MOD_WARP]]) + if exclude_ginger_island: + return + items.append(item_factory("Diamond Wand")) + items.append(item_factory("Marlon's Boat Paddle")) + items.append(item_factory("Fable Reef Portal")) + + def create_unique_filler_items(item_factory: StardewItemFactory, options: StardewValleyOptions, random: Random, available_item_slots: int) -> List[Item]: items = [] diff --git a/worlds/stardew_valley/locations.py b/worlds/stardew_valley/locations.py index 3825b9bb81f..3a43344b937 100644 --- a/worlds/stardew_valley/locations.py +++ b/worlds/stardew_valley/locations.py @@ -6,11 +6,12 @@ from . import data from .options import StardewValleyOptions, Craftsanity, Chefsanity, Cooksanity, Shipsanity, Monstersanity -from .data.fish_data import legendary_fish, special_fish, all_fish +from .data.fish_data import legendary_fish, special_fish, get_fish_for_mods from .data.museum_data import all_museum_items -from .data.villagers_data import all_villagers +from .data.villagers_data import get_villagers_for_mods from .options import ExcludeGingerIsland, Friendsanity, ArcadeMachineLocations, SpecialOrderLocations, Cropsanity, Fishsanity, Museumsanity, FestivalLocations, SkillProgression, BuildingProgression, ToolProgression, ElevatorProgression, BackpackProgression from .strings.goal_names import Goal +from .strings.villager_names import NPC, ModNPC from .strings.region_names import Region LOCATION_CODE_OFFSET = 717000 @@ -185,6 +186,7 @@ def extend_help_wanted_quests(randomized_locations: List[LocationData], desired_ def extend_fishsanity_locations(randomized_locations: List[LocationData], options: StardewValleyOptions, random: Random): prefix = "Fishsanity: " fishsanity = options.fishsanity + active_fish = get_fish_for_mods(options.mods.value) if fishsanity == Fishsanity.option_none: return elif fishsanity == Fishsanity.option_legendaries: @@ -192,19 +194,19 @@ def extend_fishsanity_locations(randomized_locations: List[LocationData], option elif fishsanity == Fishsanity.option_special: randomized_locations.extend(location_table[f"{prefix}{special.name}"] for special in special_fish) elif fishsanity == Fishsanity.option_randomized: - fish_locations = [location_table[f"{prefix}{fish.name}"] for fish in all_fish if random.random() < 0.4] + fish_locations = [location_table[f"{prefix}{fish.name}"] for fish in active_fish if random.random() < 0.4] randomized_locations.extend(filter_disabled_locations(options, fish_locations)) elif fishsanity == Fishsanity.option_all: - fish_locations = [location_table[f"{prefix}{fish.name}"] for fish in all_fish] + fish_locations = [location_table[f"{prefix}{fish.name}"] for fish in active_fish] randomized_locations.extend(filter_disabled_locations(options, fish_locations)) elif fishsanity == Fishsanity.option_exclude_legendaries: - fish_locations = [location_table[f"{prefix}{fish.name}"] for fish in all_fish if fish not in legendary_fish] + fish_locations = [location_table[f"{prefix}{fish.name}"] for fish in active_fish if fish not in legendary_fish] randomized_locations.extend(filter_disabled_locations(options, fish_locations)) elif fishsanity == Fishsanity.option_exclude_hard_fish: - fish_locations = [location_table[f"{prefix}{fish.name}"] for fish in all_fish if fish.difficulty < 80] + fish_locations = [location_table[f"{prefix}{fish.name}"] for fish in active_fish if fish.difficulty < 80] randomized_locations.extend(filter_disabled_locations(options, fish_locations)) elif options.fishsanity == Fishsanity.option_only_easy_fish: - fish_locations = [location_table[f"{prefix}{fish.name}"] for fish in all_fish if fish.difficulty < 50] + fish_locations = [location_table[f"{prefix}{fish.name}"] for fish in active_fish if fish.difficulty < 50] randomized_locations.extend(filter_disabled_locations(options, fish_locations)) @@ -222,23 +224,22 @@ def extend_museumsanity_locations(randomized_locations: List[LocationData], opti def extend_friendsanity_locations(randomized_locations: List[LocationData], options: StardewValleyOptions): + island_villagers = [NPC.leo, ModNPC.lance] if options.friendsanity == Friendsanity.option_none: return - exclude_leo = options.exclude_ginger_island == ExcludeGingerIsland.option_true + exclude_ginger_island = options.exclude_ginger_island == ExcludeGingerIsland.option_true exclude_non_bachelors = options.friendsanity == Friendsanity.option_bachelors exclude_locked_villagers = options.friendsanity == Friendsanity.option_starting_npcs or \ options.friendsanity == Friendsanity.option_bachelors include_post_marriage_hearts = options.friendsanity == Friendsanity.option_all_with_marriage heart_size = options.friendsanity_heart_size - for villager in all_villagers: - if villager.mod_name not in options.mods and villager.mod_name is not None: - continue + for villager in get_villagers_for_mods(options.mods.value): if not villager.available and exclude_locked_villagers: continue if not villager.bachelor and exclude_non_bachelors: continue - if villager.name == "Leo" and exclude_leo: + if villager.name in island_villagers and exclude_ginger_island: continue heart_cap = 8 if villager.bachelor else 10 if include_post_marriage_hearts and villager.bachelor: diff --git a/worlds/stardew_valley/logic/bundle_logic.py b/worlds/stardew_valley/logic/bundle_logic.py new file mode 100644 index 00000000000..fb7d7e27b1d --- /dev/null +++ b/worlds/stardew_valley/logic/bundle_logic.py @@ -0,0 +1,48 @@ +from typing import List + +from ..data.bundle_data import BundleItem +from .crop_logic import CropLogic +from .farming_logic import FarmingLogic +from .has_logic import HasLogic +from .money_logic import MoneyLogic +from .region_logic import RegionLogic +from ..stardew_rule import StardewRule +from ..strings.region_names import Region + + +class BundleLogic: + player: int + crop: CropLogic + farming: FarmingLogic + has: HasLogic + region: RegionLogic + money: MoneyLogic + + def __init__(self, player: int, crop: CropLogic, farming: FarmingLogic, has: HasLogic, region: RegionLogic, money: MoneyLogic): + self.player = player + self.crop = crop + self.farming = farming + self.has = has + self.region = region + self.money = money + + def can_complete_bundle(self, bundle_requirements: List[BundleItem], number_required: int) -> StardewRule: + item_rules = [] + highest_quality_yet = 0 + can_speak_junimo = self.region.can_reach(Region.wizard_tower) + for bundle_item in bundle_requirements: + if bundle_item.item.item_id == -1: + return can_speak_junimo & self.money.can_spend(bundle_item.amount) + else: + item_rules.append(bundle_item.item.name) + if bundle_item.quality > highest_quality_yet: + highest_quality_yet = bundle_item.quality + return can_speak_junimo & self.has(item_rules, number_required) & self.farming.can_grow_gold_quality(highest_quality_yet) + + def can_complete_community_center(self) -> StardewRule: + return (self.region.can_reach_location("Complete Crafts Room") & + self.region.can_reach_location("Complete Pantry") & + self.region.can_reach_location("Complete Fish Tank") & + self.region.can_reach_location("Complete Bulletin Board") & + self.region.can_reach_location("Complete Vault") & + self.region.can_reach_location("Complete Boiler Room")) diff --git a/worlds/stardew_valley/logic/crop_logic.py b/worlds/stardew_valley/logic/crop_logic.py index 02f51073286..a839893c414 100644 --- a/worlds/stardew_valley/logic/crop_logic.py +++ b/worlds/stardew_valley/logic/crop_logic.py @@ -5,7 +5,8 @@ from .season_logic import SeasonLogic from .tool_logic import ToolLogic from ..data import CropItem -from ..stardew_rule import StardewRule +from ..stardew_rule import StardewRule, True_ +from ..strings.fertilizer_names import Fertilizer from ..strings.region_names import Region from ..strings.tool_names import Tool @@ -43,3 +44,12 @@ def can_plant_and_grow_item(self, seasons: Union[str, Iterable[str]]) -> Stardew def has_island_farm(self) -> StardewRule: return self.region.can_reach(Region.island_south) + def has_fertilizer(self, tier: int) -> StardewRule: + if tier <= 0: + return True_() + if tier == 1: + return self.has(Fertilizer.basic) + if tier == 2: + return self.has(Fertilizer.quality) + if tier >= 3: + return self.has(Fertilizer.deluxe) diff --git a/worlds/stardew_valley/logic/farming_logic.py b/worlds/stardew_valley/logic/farming_logic.py new file mode 100644 index 00000000000..3a9ced9948b --- /dev/null +++ b/worlds/stardew_valley/logic/farming_logic.py @@ -0,0 +1,29 @@ +from ..stardew_rule import StardewRule, True_ +from .skill_logic import SkillLogic +from .crop_logic import CropLogic + + +class FarmingLogic: + player: int + crop: CropLogic + skill: SkillLogic + + def __init__(self, player: int, crop: CropLogic, skill: SkillLogic): + self.player = player + self.crop = crop + self.skill = skill + + def can_grow_gold_quality(self, quality: int) -> StardewRule: + if quality <= 0: + return True_() + if quality == 1: + return self.skill.has_farming_level(5) | (self.crop.has_fertilizer(1) & self.skill.has_farming_level(2)) | ( + self.crop.has_fertilizer(2) & self.skill.has_farming_level(1)) | self.crop.has_fertilizer(3) + if quality == 2: + return self.skill.has_farming_level(10) | ( + self.crop.has_fertilizer(1) & self.skill.has_farming_level(5)) | ( + self.crop.has_fertilizer(2) & self.skill.has_farming_level(3)) | ( + self.crop.has_fertilizer(3) & self.skill.has_farming_level(2)) + if quality >= 3: + return self.crop.has_fertilizer(3) & self.skill.has_farming_level(4) + diff --git a/worlds/stardew_valley/logic/logic.py b/worlds/stardew_valley/logic/logic.py index 81587bcaa42..4b142873160 100644 --- a/worlds/stardew_valley/logic/logic.py +++ b/worlds/stardew_valley/logic/logic.py @@ -1,17 +1,19 @@ from __future__ import annotations from dataclasses import field, dataclass -from typing import Dict, List, Set +from typing import Dict, Set from .ability_logic import AbilityLogic from .action_logic import ActionLogic from .arcade_logic import ArcadeLogic from .artisan_logic import ArtisanLogic from .building_logic import BuildingLogic +from .bundle_logic import BundleLogic from .combat_logic import CombatLogic from .cooking_logic import CookingLogic from .crafting_logic import CraftingLogic from .crop_logic import CropLogic +from .farming_logic import FarmingLogic from .fishing_logic import FishingLogic from .gift_logic import GiftLogic from .mine_logic import MineLogic @@ -19,6 +21,7 @@ from .monster_logic import MonsterLogic from .museum_logic import MuseumLogic from .pet_logic import PetLogic +from .quest_logic import QuestLogic from .received_logic import ReceivedLogic from .has_logic import HasLogic from .region_logic import RegionLogic @@ -35,8 +38,7 @@ from ..data.monster_data import all_monsters_by_category, all_monsters_by_name from ..mods.logic.mod_logic import ModLogic from ..data import all_fish, FishItem, all_purchasable_seeds, SeedItem, all_crops -from ..data.bundle_data import BundleItem -from ..data.fish_data import island_fish, legendary_fish, extended_family +from ..data.fish_data import island_fish, legendary_fish, extended_family, get_fish_for_mods from ..data.museum_data import all_museum_items from ..data.recipe_data import all_cooking_recipes from ..options import Cropsanity, SpecialOrderLocations, ExcludeGingerIsland, FestivalLocations, StardewValleyOptions @@ -50,13 +52,13 @@ from ..strings.artisan_good_names import ArtisanGood from ..strings.building_names import Building from ..strings.calendar_names import Weekday -from worlds.stardew_valley.strings.craftable_names import Craftable, Consumable, Furniture, Ring, Fishing, Lighting +from worlds.stardew_valley.strings.craftable_names import Consumable, Furniture, Ring, Fishing, Lighting from ..strings.crop_names import Fruit, Vegetable from ..strings.currency_names import Currency from ..strings.decoration_names import Decoration from ..strings.fertilizer_names import Fertilizer from ..strings.festival_check_names import FestivalCheck -from ..strings.fish_names import Fish, Trash, WaterItem, WaterChest +from ..strings.fish_names import Fish, Trash, WaterItem, WaterChest, SVEFish from ..strings.flower_names import Flower from ..strings.forageable_names import Forageable from ..strings.fruit_tree_names import Sapling @@ -70,7 +72,6 @@ from ..strings.metal_names import Ore, MetalBar, Mineral, Fossil from ..strings.monster_drop_names import Loot from ..strings.monster_names import Monster -from ..strings.quest_names import Quest from ..strings.region_names import Region from ..strings.season_names import Season from ..strings.seed_names import Seed, TreeSeed @@ -98,7 +99,6 @@ class StardewLogic: crop_rules: Dict[str, StardewRule] = field(default_factory=dict) fish_rules: Dict[str, StardewRule] = field(default_factory=dict) museum_rules: Dict[str, StardewRule] = field(default_factory=dict) - quest_rules: Dict[str, StardewRule] = field(default_factory=dict) festival_rules: Dict[str, StardewRule] = field(default_factory=dict) def __post_init__(self): @@ -131,6 +131,8 @@ def __post_init__(self): self.pet = PetLogic(self.player, friendsanity_option, heart_size_option, self.received, self.region, self.time, self.tool) self.crop = CropLogic(self.player, self.has, self.region, self.season, self.tool) self.skill = SkillLogic(self.player, skill_option, self.received, self.has, self.region, self.season, self.time, self.tool, self.combat, self.crop) + self.farming = FarmingLogic(self.player, self.crop, self.skill) + self.bundle = BundleLogic(self.player, self.crop, self.farming, self.has, self.region, self.money) self.fishing = FishingLogic(self.player, self.region, self.tool, self.skill) self.mine = MineLogic(self.player, tool_option, skill_option, elevator_option, self.received, self.region, self.combat, self.tool, self.skill) @@ -139,12 +141,14 @@ def __post_init__(self): self.region, self.tool, self.skill, self.mine) self.special_order = SpecialOrderLogic(self.player, self.received, self.has, self.region, self.season, self.time, self.money, self.shipping, self.arcade, self.artisan, self.relationship, self.tool, self.skill, self.mine, self.cooking, self.ability) + self.quest = QuestLogic(self.player, self.skill, self.received, self.has, self.mine, self.region, self.action, self.relationship, self.buildings, + self.time, self.tool, self.fishing, self.cooking, self.money, self.combat, self.season, self.wallet, mods_option) self.crafting = CraftingLogic(self.player, self.options.craftsanity, self.options.festival_locations, self.options.special_order_locations, self.received, self.has, self.region, self.time, self.money, self.relationship, self.skill, self.special_order) - - self.mod = ModLogic(self.player, skill_option, elevator_option, mods_option, self.received, self.has, self.region, self.action, self.season, self.money, - self.relationship, self.buildings, self.wallet, self.combat, self.tool, self.skill, self.fishing, self.cooking, self.mine, self.ability) + self.mod = ModLogic(self.player, skill_option, elevator_option, mods_option, self.received, self.has, self.region, self.action, self.artisan, self.season, self.money, + self.relationship, self.buildings, self.wallet, self.combat, self.tool, self.skill, self.fishing, self.cooking, self.mine, self.ability, + self.time, self.quest, self.crafting, self.crop) self.fish_rules.update({fish.name: self.can_catch_fish(fish) for fish in all_fish}) self.museum_rules.update({donation.name: self.museum.can_find_museum_item(donation) for donation in all_museum_items}) @@ -420,8 +424,8 @@ def __post_init__(self): TreeSeed.mushroom: self.money.can_trade_at(Region.qi_walnut_room, Currency.qi_gem, 5), TreeSeed.pine: self.skill.has_level(Skill.foraging, 1) & self.ability.can_chop_trees(), Vegetable.tea_leaves: self.has(Sapling.tea) & self.time.has_lived_months(2) & self.season.has_any_not_winter(), - WaterItem.clam: self.tool.can_forage(Generic.any, Region.beach), - WaterItem.cockle: self.tool.can_forage(Generic.any, Region.beach), + Fish.clam: self.tool.can_forage(Generic.any, Region.beach), + Fish.cockle: self.tool.can_forage(Generic.any, Region.beach), WaterItem.coral: self.tool.can_forage(Generic.any, Region.tide_pools) | self.tool.can_forage(Season.summer, Region.beach), WaterItem.green_algae: self.fishing.can_fish_in_freshwater(), WaterItem.nautilus_shell: self.tool.can_forage(Season.winter, Region.beach), @@ -435,6 +439,7 @@ def __post_init__(self): self.item_rules.update(self.tree_fruit_rules) self.item_rules.update(self.seed_rules) self.item_rules.update(self.crop_rules) + self.item_rules.update(self.mod.item.get_modded_item_rules()) # For some recipes, the cooked item can be obtained directly, so we either cook it or get it for recipe in self.cooking_rules: @@ -451,62 +456,8 @@ def __post_init__(self): self.buildings.initialize_rules() self.buildings.update_rules(self.mod.buildings.get_modded_building_rules()) - self.quest_rules.update({ - Quest.introductions: self.region.can_reach(Region.town), - Quest.how_to_win_friends: self.can_complete_quest(Quest.introductions), - Quest.getting_started: self.has(Vegetable.parsnip) & self.tool.has_tool(Tool.hoe) & self.tool.can_water(0), - Quest.to_the_beach: self.region.can_reach(Region.beach), - Quest.raising_animals: self.can_complete_quest(Quest.getting_started) & self.buildings.has_building(Building.coop), - Quest.advancement: self.can_complete_quest(Quest.getting_started) & self.has(Craftable.scarecrow), - Quest.archaeology: (self.tool.has_tool(Tool.hoe) | self.mine.can_mine_in_the_mines_floor_1_40() | self.skill.can_fish()) & self.region.can_reach(Region.museum), - Quest.meet_the_wizard: self.region.can_reach(Region.town) & self.region.can_reach(Region.community_center) & self.region.can_reach(Region.wizard_tower), - Quest.forging_ahead: self.has(Ore.copper) & self.has(Machine.furnace), - Quest.smelting: self.has(MetalBar.copper), - Quest.initiation: self.mine.can_mine_in_the_mines_floor_1_40(), - Quest.robins_lost_axe: self.season.has(Season.spring) & self.region.can_reach(Region.forest) & self.relationship.can_meet(NPC.robin), - Quest.jodis_request: self.season.has(Season.spring) & self.has(Vegetable.cauliflower) & self.relationship.can_meet(NPC.jodi), - Quest.mayors_shorts: self.season.has(Season.summer) & self.region.can_reach(Region.ranch) & - (self.relationship.has_hearts(NPC.marnie, 2) | (self.mod.magic.can_blink())) & self.relationship.can_meet(NPC.lewis), - Quest.blackberry_basket: self.season.has(Season.fall) & self.relationship.can_meet(NPC.linus), - Quest.marnies_request: self.relationship.has_hearts(NPC.marnie, 3) & self.has(Forageable.cave_carrot) & self.region.can_reach(Region.ranch), - Quest.pam_is_thirsty: self.season.has(Season.summer) & self.has(ArtisanGood.pale_ale) & self.relationship.can_meet(NPC.pam), - Quest.a_dark_reagent: self.season.has(Season.winter) & self.has(Loot.void_essence) & self.relationship.can_meet(NPC.wizard), - Quest.cows_delight: self.season.has(Season.fall) & self.has(Vegetable.amaranth) & self.relationship.can_meet(NPC.marnie), - Quest.the_skull_key: self.received(Wallet.skull_key) & self.region.can_reach(Region.skull_cavern_entrance), - Quest.crop_research: self.season.has(Season.summer) & self.has(Fruit.melon) & self.relationship.can_meet(NPC.demetrius), - Quest.knee_therapy: self.season.has(Season.summer) & self.has(Fruit.hot_pepper) & self.relationship.can_meet(NPC.george), - Quest.robins_request: self.season.has(Season.winter) & self.has(Material.hardwood) & self.relationship.can_meet(NPC.robin), - Quest.qis_challenge: self.mine.can_mine_in_the_skull_cavern(), - Quest.the_mysterious_qi: self.region.can_reach(Region.bus_tunnel) & self.has(ArtisanGood.battery_pack) & self.region.can_reach(Region.desert) & self.has(Forageable.rainbow_shell) & self.has(Vegetable.beet) & self.has(Loot.solar_essence), - Quest.carving_pumpkins: self.season.has(Season.fall) & self.has(Vegetable.pumpkin) & self.relationship.can_meet(NPC.caroline), - Quest.a_winter_mystery: self.season.has(Season.winter) & self.region.can_reach(Region.town), - Quest.strange_note: self.has(Forageable.secret_note) & self.region.can_reach(Region.secret_woods) & self.has(ArtisanGood.maple_syrup), - Quest.cryptic_note: self.has(Forageable.secret_note) & self.region.can_reach(Region.skull_cavern_100), - Quest.fresh_fruit: self.season.has(Season.spring) & self.has(Fruit.apricot) & self.relationship.can_meet(NPC.emily), - Quest.aquatic_research: self.season.has(Season.summer) & self.has(Fish.pufferfish) & self.relationship.can_meet(NPC.demetrius), - Quest.a_soldiers_star: self.season.has(Season.summer) & self.time.has_year_two() & self.has(Fruit.starfruit) & self.relationship.can_meet(NPC.kent), - Quest.mayors_need: self.season.has(Season.summer) & self.has(ArtisanGood.truffle_oil) & self.relationship.can_meet(NPC.lewis), - Quest.wanted_lobster: self.season.has(Season.fall) & self.season.has(Season.fall) & self.has(Fish.lobster) & self.relationship.can_meet(NPC.gus), - Quest.pam_needs_juice: self.season.has(Season.fall) & self.has(ArtisanGood.battery_pack) & self.relationship.can_meet(NPC.pam), - Quest.fish_casserole: self.relationship.has_hearts(NPC.jodi, 4) & self.has(Fish.largemouth_bass) & self.region.can_reach(Region.sam_house), - Quest.catch_a_squid: self.season.has(Season.winter) & self.has(Fish.squid) & self.relationship.can_meet(NPC.willy), - Quest.fish_stew: self.season.has(Season.winter) & self.has(Fish.albacore) & self.relationship.can_meet(NPC.gus), - Quest.pierres_notice: self.season.has(Season.spring) & self.has("Sashimi") & self.relationship.can_meet(NPC.pierre), - Quest.clints_attempt: self.season.has(Season.winter) & self.has(Mineral.amethyst) & self.relationship.can_meet(NPC.emily), - Quest.a_favor_for_clint: self.season.has(Season.winter) & self.has(MetalBar.iron) & self.relationship.can_meet(NPC.clint), - Quest.staff_of_power: self.season.has(Season.winter) & self.has(MetalBar.iridium) & self.relationship.can_meet(NPC.wizard), - Quest.grannys_gift: self.season.has(Season.spring) & self.has(Forageable.leek) & self.relationship.can_meet(NPC.evelyn), - Quest.exotic_spirits: self.season.has(Season.winter) & self.has(Forageable.coconut) & self.relationship.can_meet(NPC.gus), - Quest.catch_a_lingcod: self.season.has(Season.winter) & self.has("Lingcod") & self.relationship.can_meet(NPC.willy), - Quest.dark_talisman: self.wallet.has_rusty_key() & self.region.can_reach(Region.railroad) & self.relationship.can_meet(NPC.krobus) & self.region.can_reach(Region.mutant_bug_lair), - Quest.goblin_problem: self.region.can_reach(Region.witch_swamp) & self.has(ArtisanGood.void_mayonnaise), - Quest.magic_ink: self.region.can_reach(Region.witch_hut) & self.relationship.can_meet(NPC.wizard), - Quest.the_pirates_wife: self.region.can_reach(Region.island_west) & self.relationship.can_meet(NPC.kent) & - self.relationship.can_meet(NPC.gus) & self.relationship.can_meet(NPC.sandy) & self.relationship.can_meet(NPC.george) & - self.relationship.can_meet(NPC.wizard) & self.relationship.can_meet(NPC.willy), - }) - - self.quest_rules.update(self.mod.quests.get_modded_quest_rules()) + self.quest.initialize_rules() + self.quest.update_rules(self.mod.quests.get_modded_quest_rules()) self.festival_rules.update({ FestivalCheck.egg_hunt: self.can_win_egg_hunt(), @@ -549,9 +500,6 @@ def __post_init__(self): self.special_order.initialize_rules() self.special_order.update_rules(self.mod.special_orders.get_modded_special_orders_rules(self.special_order.special_order_rules)) - def can_complete_quest(self, quest: str) -> StardewRule: - return Has(quest, self.quest_rules) - def can_buy_seed(self, seed: SeedItem) -> StardewRule: if self.options.cropsanity == Cropsanity.option_disabled or seed.name == Seed.qi_bean: item_rule = True_() @@ -595,13 +543,17 @@ def can_catch_fish(self, fish: FishItem) -> StardewRule: difficulty_rule = self.skill.can_crab_pot() else: difficulty_rule = self.skill.can_fish([], 120 if fish.legendary else fish.difficulty) - return quest_rule & region_rule & season_rule & difficulty_rule + if fish.name == SVEFish.kittyfish: + item_rule = self.received("Kittyfish Spell") + else: + item_rule = True_() + return quest_rule & region_rule & season_rule & difficulty_rule & item_rule def can_catch_every_fish(self) -> StardewRule: rules = [self.skill.has_level(Skill.fishing, 10), self.tool.has_fishing_rod(4)] exclude_island = self.options.exclude_ginger_island == ExcludeGingerIsland.option_true exclude_extended_family = self.options.special_order_locations != SpecialOrderLocations.option_board_qi - for fish in all_fish: + for fish in get_fish_for_mods(self.options.mods.value): if exclude_island and fish in island_fish: continue if exclude_extended_family and fish in extended_family: @@ -626,42 +578,6 @@ def has_traveling_merchant(self, tier: int = 1): traveling_merchant_days = [f"Traveling Merchant: {day}" for day in Weekday.all_days] return self.received(traveling_merchant_days, tier) - def can_complete_bundle(self, bundle_requirements: List[BundleItem], number_required: int) -> StardewRule: - item_rules = [] - highest_quality_yet = 0 - can_speak_junimo = self.region.can_reach(Region.wizard_tower) - for bundle_item in bundle_requirements: - if bundle_item.item.item_id == -1: - return can_speak_junimo & self.money.can_spend(bundle_item.amount) - else: - item_rules.append(bundle_item.item.name) - if bundle_item.quality > highest_quality_yet: - highest_quality_yet = bundle_item.quality - return can_speak_junimo & self.has(item_rules, number_required) & self.can_grow_gold_quality(highest_quality_yet) - - def can_grow_gold_quality(self, quality: int) -> StardewRule: - if quality <= 0: - return True_() - if quality == 1: - return self.skill.has_farming_level(5) | (self.has_fertilizer(1) & self.skill.has_farming_level(2)) | ( - self.has_fertilizer(2) & self.skill.has_farming_level(1)) | self.has_fertilizer(3) - if quality == 2: - return self.skill.has_farming_level(10) | (self.has_fertilizer(1) & self.skill.has_farming_level(5)) | ( - self.has_fertilizer(2) & self.skill.has_farming_level(3)) | ( - self.has_fertilizer(3) & self.skill.has_farming_level(2)) - if quality >= 3: - return self.has_fertilizer(3) & self.skill.has_farming_level(4) - - def has_fertilizer(self, tier: int) -> StardewRule: - if tier <= 0: - return True_() - if tier == 1: - return self.has(Fertilizer.basic) - if tier == 2: - return self.has(Fertilizer.quality) - if tier >= 3: - return self.has(Fertilizer.deluxe) - def can_complete_field_office(self) -> StardewRule: field_office = self.region.can_reach(Region.field_office) professor_snail = self.received("Open Professor Snail Cave") @@ -675,14 +591,6 @@ def can_complete_field_office(self) -> StardewRule: snake_vertebrae = self.has(Fossil.snake_vertebrae) return field_office & professor_snail & tools & leg_and_snake_skull & ribs_and_spine & skull & tail & frog & bat & snake_vertebrae - def can_complete_community_center(self) -> StardewRule: - return (self.region.can_reach_location("Complete Crafts Room") & - self.region.can_reach_location("Complete Pantry") & - self.region.can_reach_location("Complete Fish Tank") & - self.region.can_reach_location("Complete Bulletin Board") & - self.region.can_reach_location("Complete Vault") & - self.region.can_reach_location("Complete Boiler Room")) - def can_finish_grandpa_evaluation(self) -> StardewRule: # https://stardewvalleywiki.com/Grandpa rules_worth_a_point = [self.money.can_have_earned_total(50000), # 50 000g @@ -701,9 +609,9 @@ def can_finish_grandpa_evaluation(self) -> StardewRule: self.relationship.has_hearts("5", 8), # 5 Friends self.relationship.has_hearts("10", 8), # 10 friends self.pet.has_hearts(5), # Max Pet - self.can_complete_community_center(), # Community Center Completion - self.can_complete_community_center(), # CC Ceremony first point - self.can_complete_community_center(), # CC Ceremony second point + self.bundle.can_complete_community_center(), # Community Center Completion + self.bundle.can_complete_community_center(), # CC Ceremony first point + self.bundle.can_complete_community_center(), # CC Ceremony second point self.received(Wallet.skull_key), # Skull Key obtained self.wallet.has_rusty_key(), # Rusty key obtained ] @@ -884,5 +792,5 @@ def has_movie_theater(self) -> StardewRule: return self.received(CommunityUpgrade.movie_theater, 2) def can_use_obelisk(self, obelisk: str) -> StardewRule: - return self.region.can_reach(Region.wizard_tower) & self.region.can_reach(Region.farm) & self.received(obelisk) + return self.region.can_reach(Region.wizard_tower) & self.received(obelisk) diff --git a/worlds/stardew_valley/logic/quest_logic.py b/worlds/stardew_valley/logic/quest_logic.py new file mode 100644 index 00000000000..82b067374fa --- /dev/null +++ b/worlds/stardew_valley/logic/quest_logic.py @@ -0,0 +1,142 @@ +from typing import Dict +from dataclasses import field + +from .action_logic import ActionLogic +from .building_logic import BuildingLogic +from .combat_logic import CombatLogic +from .cooking_logic import CookingLogic +from .fishing_logic import FishingLogic +from .has_logic import HasLogic +from .mine_logic import MineLogic +from .money_logic import MoneyLogic +from .received_logic import ReceivedLogic +from .region_logic import RegionLogic +from .relationship_logic import RelationshipLogic +from .season_logic import SeasonLogic +from .skill_logic import SkillLogic +from .time_logic import TimeLogic +from .tool_logic import ToolLogic +from .wallet_logic import WalletLogic +from ..options import SkillProgression, Mods +from ..strings.artisan_good_names import ArtisanGood +from ..strings.building_names import Building +from ..strings.craftable_names import Craftable +from ..strings.crop_names import Fruit, Vegetable +from ..strings.fish_names import Fish +from ..strings.food_names import Meal +from ..strings.forageable_names import Forageable +from ..strings.machine_names import Machine +from ..strings.monster_drop_names import Loot +from ..strings.material_names import Material +from ..strings.metal_names import MetalBar, Ore, Mineral +from ..strings.region_names import Region +from ..strings.season_names import Season +from ..strings.tool_names import Tool +from ..strings.quest_names import Quest +from ..strings.villager_names import NPC +from ..strings.wallet_item_names import Wallet +from ..stardew_rule import StardewRule, Has + + +class QuestLogic: + player: int + received: ReceivedLogic + has: HasLogic + mine: MineLogic + region: RegionLogic + relationship: RelationshipLogic + tool: ToolLogic + fishing: FishingLogic + cooking: CookingLogic + mods_option: Mods + money: MoneyLogic + combat: CombatLogic + season: SeasonLogic + skill: SkillLogic + wallet: WalletLogic + quest_rules: Dict[str, StardewRule] + + def __init__(self, player: int, skill: SkillLogic, received: ReceivedLogic, has: HasLogic, mine: MineLogic, region: RegionLogic, action: ActionLogic, + relationship: RelationshipLogic, building: BuildingLogic, time: TimeLogic, tool: ToolLogic, fishing: FishingLogic, cooking: CookingLogic, + money: MoneyLogic, combat: CombatLogic, season: SeasonLogic, wallet: WalletLogic, mods_option: Mods): + self.player = player + self.skill = skill + self.received = received + self.has = has + self.mine = mine + self.region = region + self.action = action + self.relationship = relationship + self.building = building + self.time = time + self.tool = tool + self.fishing = fishing + self.cooking = cooking + self.mods_option = mods_option + self.money = money + self.combat = combat + self.season = season + self.wallet = wallet + self.quest_rules = dict() + + def initialize_rules(self): + self.quest_rules.update({ + Quest.introductions: self.region.can_reach(Region.town), + Quest.how_to_win_friends: self.can_complete_quest(Quest.introductions), + Quest.getting_started: self.has(Vegetable.parsnip) & self.tool.has_tool(Tool.hoe) & self.tool.can_water(0), + Quest.to_the_beach: self.region.can_reach(Region.beach), + Quest.raising_animals: self.can_complete_quest(Quest.getting_started) & self.building.has_building(Building.coop), + Quest.advancement: self.can_complete_quest(Quest.getting_started) & self.has(Craftable.scarecrow), + Quest.archaeology: (self.tool.has_tool(Tool.hoe) | self.mine.can_mine_in_the_mines_floor_1_40() | self.skill.can_fish()) & self.region.can_reach(Region.museum), + Quest.meet_the_wizard: self.region.can_reach(Region.town) & self.region.can_reach(Region.community_center) & self.region.can_reach(Region.wizard_tower), + Quest.forging_ahead: self.has(Ore.copper) & self.has(Machine.furnace), + Quest.smelting: self.has(MetalBar.copper), + Quest.initiation: self.mine.can_mine_in_the_mines_floor_1_40(), + Quest.robins_lost_axe: self.season.has(Season.spring) & self.region.can_reach(Region.forest) & self.relationship.can_meet(NPC.robin), + Quest.jodis_request: self.season.has(Season.spring) & self.has(Vegetable.cauliflower) & self.relationship.can_meet(NPC.jodi), + Quest.mayors_shorts: self.season.has(Season.summer) & self.region.can_reach(Region.ranch) & + self.relationship.has_hearts(NPC.marnie, 2) & self.relationship.can_meet(NPC.lewis), + Quest.blackberry_basket: self.season.has(Season.fall) & self.relationship.can_meet(NPC.linus), + Quest.marnies_request: self.relationship.has_hearts(NPC.marnie, 3) & self.has(Forageable.cave_carrot) & self.region.can_reach(Region.ranch), + Quest.pam_is_thirsty: self.season.has(Season.summer) & self.has(ArtisanGood.pale_ale) & self.relationship.can_meet(NPC.pam), + Quest.a_dark_reagent: self.season.has(Season.winter) & self.has(Loot.void_essence) & self.relationship.can_meet(NPC.wizard), + Quest.cows_delight: self.season.has(Season.fall) & self.has(Vegetable.amaranth) & self.relationship.can_meet(NPC.marnie), + Quest.the_skull_key: self.received(Wallet.skull_key) & self.region.can_reach(Region.skull_cavern_entrance), + Quest.crop_research: self.season.has(Season.summer) & self.has(Fruit.melon) & self.relationship.can_meet(NPC.demetrius), + Quest.knee_therapy: self.season.has(Season.summer) & self.has(Fruit.hot_pepper) & self.relationship.can_meet(NPC.george), + Quest.robins_request: self.season.has(Season.winter) & self.has(Material.hardwood) & self.relationship.can_meet(NPC.robin), + Quest.qis_challenge: self.mine.can_mine_in_the_skull_cavern(), + Quest.the_mysterious_qi: self.region.can_reach(Region.bus_tunnel) & self.has(ArtisanGood.battery_pack) & self.region.can_reach(Region.desert) & self.has(Forageable.rainbow_shell) & self.has(Vegetable.beet) & self.has(Loot.solar_essence), + Quest.carving_pumpkins: self.season.has(Season.fall) & self.has(Vegetable.pumpkin) & self.relationship.can_meet(NPC.caroline), + Quest.a_winter_mystery: self.season.has(Season.winter) & self.region.can_reach(Region.town), + Quest.strange_note: self.has(Forageable.secret_note) & self.region.can_reach(Region.secret_woods) & self.has(ArtisanGood.maple_syrup), + Quest.cryptic_note: self.has(Forageable.secret_note) & self.region.can_reach(Region.skull_cavern_100), + Quest.fresh_fruit: self.season.has(Season.spring) & self.has(Fruit.apricot) & self.relationship.can_meet(NPC.emily), + Quest.aquatic_research: self.season.has(Season.summer) & self.has(Fish.pufferfish) & self.relationship.can_meet(NPC.demetrius), + Quest.a_soldiers_star: self.season.has(Season.summer) & self.time.has_year_two() & self.has(Fruit.starfruit) & self.relationship.can_meet(NPC.kent), + Quest.mayors_need: self.season.has(Season.summer) & self.has(ArtisanGood.truffle_oil) & self.relationship.can_meet(NPC.lewis), + Quest.wanted_lobster: self.season.has(Season.fall) & self.season.has(Season.fall) & self.has(Fish.lobster) & self.relationship.can_meet(NPC.gus), + Quest.pam_needs_juice: self.season.has(Season.fall) & self.has(ArtisanGood.battery_pack) & self.relationship.can_meet(NPC.pam), + Quest.fish_casserole: self.relationship.has_hearts(NPC.jodi, 4) & self.has(Fish.largemouth_bass) & self.region.can_reach(Region.sam_house), + Quest.catch_a_squid: self.season.has(Season.winter) & self.has(Fish.squid) & self.relationship.can_meet(NPC.willy), + Quest.fish_stew: self.season.has(Season.winter) & self.has(Fish.albacore) & self.relationship.can_meet(NPC.gus), + Quest.pierres_notice: self.season.has(Season.spring) & self.has(Meal.sashimi) & self.relationship.can_meet(NPC.pierre), + Quest.clints_attempt: self.season.has(Season.winter) & self.has(Mineral.amethyst) & self.relationship.can_meet(NPC.emily), + Quest.a_favor_for_clint: self.season.has(Season.winter) & self.has(MetalBar.iron) & self.relationship.can_meet(NPC.clint), + Quest.staff_of_power: self.season.has(Season.winter) & self.has(MetalBar.iridium) & self.relationship.can_meet(NPC.wizard), + Quest.grannys_gift: self.season.has(Season.spring) & self.has(Forageable.leek) & self.relationship.can_meet(NPC.evelyn), + Quest.exotic_spirits: self.season.has(Season.winter) & self.has(Forageable.coconut) & self.relationship.can_meet(NPC.gus), + Quest.catch_a_lingcod: self.season.has(Season.winter) & self.has(Fish.lingcod) & self.relationship.can_meet(NPC.willy), + Quest.dark_talisman: self.wallet.has_rusty_key() & self.region.can_reach(Region.railroad) & self.relationship.can_meet(NPC.krobus) & self.region.can_reach(Region.mutant_bug_lair), + Quest.goblin_problem: self.region.can_reach(Region.witch_swamp) & self.has(ArtisanGood.void_mayonnaise), + Quest.magic_ink: self.region.can_reach(Region.witch_hut) & self.relationship.can_meet(NPC.wizard), + Quest.the_pirates_wife: self.region.can_reach(Region.island_west) & self.relationship.can_meet(NPC.kent) & + self.relationship.can_meet(NPC.gus) & self.relationship.can_meet(NPC.sandy) & self.relationship.can_meet(NPC.george) & + self.relationship.can_meet(NPC.wizard) & self.relationship.can_meet(NPC.willy), + }) + + def update_rules(self, new_rules: Dict[str, StardewRule]): + self.quest_rules.update(new_rules) + + def can_complete_quest(self, quest: str) -> StardewRule: + return Has(quest, self.quest_rules) diff --git a/worlds/stardew_valley/logic/relationship_logic.py b/worlds/stardew_valley/logic/relationship_logic.py index 400b91fd54c..53010b6e512 100644 --- a/worlds/stardew_valley/logic/relationship_logic.py +++ b/worlds/stardew_valley/logic/relationship_logic.py @@ -10,12 +10,13 @@ from .season_logic import SeasonLogic from .time_logic import TimeLogic from .. import options -from ..data.villagers_data import all_villagers_by_name, Villager +from ..data.villagers_data import all_villagers_by_name, get_villagers_for_mods, Villager from ..options import Friendsanity, FriendsanityHeartSize, Mods from ..stardew_rule import StardewRule, True_, And, Or, Count from ..strings.generic_names import Generic from ..strings.gift_names import Gift -from ..strings.villager_names import NPC +from ..strings.villager_names import NPC, ModNPC +from ..strings.region_names import Region class RelationshipLogic: @@ -122,6 +123,8 @@ def can_meet(self, npc: str) -> StardewRule: rules.append(self.time.has_year_two()) elif npc == NPC.leo: rules.append(self.received("Island West Turtle")) + elif npc == ModNPC.lance: + rules.append(self.region.can_reach(Region.volcano_floor_10)) return And(rules) @@ -166,7 +169,7 @@ def can_earn_relationship(self, npc: str, hearts: int = 0) -> StardewRule: def npc_is_in_current_slot(self, name: str) -> bool: npc = all_villagers_by_name[name] mod = npc.mod_name - return mod is None or mod in self.mods_option + return not mod or npc in get_villagers_for_mods(self.mods_option.value) def heart(self, npc: Union[str, Villager]) -> str: if isinstance(npc, str): diff --git a/worlds/stardew_valley/mods/logic/buildings_logic.py b/worlds/stardew_valley/mods/logic/buildings_logic.py index 2e151538c1a..45d4dcb1d11 100644 --- a/worlds/stardew_valley/mods/logic/buildings_logic.py +++ b/worlds/stardew_valley/mods/logic/buildings_logic.py @@ -1,5 +1,6 @@ -from typing import Iterable +from typing import Dict +from ...stardew_rule import StardewRule from ...logic.has_logic import HasLogic from ...logic.money_logic import MoneyLogic from ...options import Mods @@ -22,8 +23,8 @@ def __init__(self, player: int, has: HasLogic, money: MoneyLogic, mods_option: M self.money = money self.mods_option = mods_option - def get_modded_building_rules(self): - buildings = {} + def get_modded_building_rules(self) -> Dict[str, StardewRule]: + buildings = dict() if ModNames.tractor in self.mods_option: tractor_rule = self.money.can_spend_at(Region.carpenter, 150000) & self.has(MetalBar.iron) & self.has(MetalBar.iridium) & self.has(ArtisanGood.battery_pack) buildings.update({ModBuilding.tractor_garage: tractor_rule}) diff --git a/worlds/stardew_valley/mods/logic/item_logic.py b/worlds/stardew_valley/mods/logic/item_logic.py new file mode 100644 index 00000000000..76a60ead63e --- /dev/null +++ b/worlds/stardew_valley/mods/logic/item_logic.py @@ -0,0 +1,83 @@ +from typing import Dict + +from ...logic.combat_logic import CombatLogic +from ...logic.cooking_logic import CookingLogic +from ...logic.has_logic import HasLogic +from ...logic.money_logic import MoneyLogic +from ...logic.region_logic import RegionLogic +from ...logic.relationship_logic import RelationshipLogic +from ...logic.season_logic import SeasonLogic +from ...logic.received_logic import ReceivedLogic +from ...logic.tool_logic import ToolLogic +from ...options import Mods +from ..mod_data import ModNames +from ...strings.crop_names import SVEVegetable, SVEFruit +from ...strings.fish_names import Fish, SVEFish +from ...strings.ingredient_names import Ingredient +from ...strings.tool_names import Tool, ToolMaterial +from ...strings.villager_names import NPC +from ...strings.food_names import Meal +from ...strings.forageable_names import SVEForage +from ...strings.monster_drop_names import Loot, ModLoot +from ...strings.season_names import Season +from ...strings.region_names import Region, SVERegion +from ...stardew_rule import StardewRule + + +class ModItemLogic: + mods: Mods + combat: CombatLogic + cooking: CookingLogic + has: HasLogic + money: MoneyLogic + region: RegionLogic + season: SeasonLogic + relationship: RelationshipLogic + received: ReceivedLogic + tool: ToolLogic + + def __init__(self, mods: Mods, combat: CombatLogic, cooking: CookingLogic, has: HasLogic, money: MoneyLogic, region: RegionLogic, + season: SeasonLogic, relationship: RelationshipLogic, tool: ToolLogic): + self.combat = combat + self.cooking = cooking + self.mods = mods + self.has = has + self.money = money + self.region = region + self.season = season + self.relationship = relationship + self.tool = tool + + def get_modded_item_rules(self) -> Dict[str, StardewRule]: + items = dict() + if ModNames.sve in self.mods: + items.update({ + "Aged Blue Moon Wine": self.region.can_reach(SVERegion.sophias_house) & self.money.can_spend(28000), + "Big Bark Burger": self.cooking.can_cook() & self.has([SVEFish.puppyfish, Meal.bread, Ingredient.oil]) & + self.relationship.has_hearts(NPC.gus, 5) & self.money.can_spend(5500) & + self.region.can_reach(Region.saloon), + "Blue Moon Wine": self.region.can_reach(SVERegion.sophias_house) & self.money.can_spend(3000), + ModLoot.fungus_seed: self.region.can_reach(SVERegion.highlands_cavern) & self.combat.has_good_weapon(), + "Glazed Butterfish": self.cooking.can_cook() & self.has([SVEFish.butterfish, Ingredient.wheat_flour, Ingredient.oil]) & + self.relationship.has_hearts(NPC.gus, 10) & self.money.can_spend( + 4000) & self.region.can_reach(Region.saloon), + "Green Mushroom": self.region.can_reach(SVERegion.highlands) & self.tool.has_tool(Tool.axe, ToolMaterial.iron), + SVEFruit.monster_fruit: self.season.has(Season.summer) & self.has(ModLoot.stalk_seed), + SVEVegetable.monster_mushroom: self.season.has(Season.fall) & self.has(ModLoot.fungus_seed), + SVEForage.ornate_treasure_chest: self.region.can_reach(SVERegion.highlands) & self.combat.has_galaxy_weapon() & + self.tool.has_tool(Tool.axe,ToolMaterial.iron), + SVEFruit.slime_berry: self.season.has(Season.spring) & self.has(ModLoot.slime_seed), + ModLoot.slime_seed: self.region.can_reach(SVERegion.highlands) & self.combat.has_good_weapon(), + ModLoot.stalk_seed: self.region.can_reach(SVERegion.highlands) & self.combat.has_good_weapon(), + SVEForage.swirl_stone: self.region.can_reach(SVERegion.crimson_badlands) & self.combat.has_great_weapon(), + "Void Delight": self.has(SVEFish.void_eel) & self.has(Loot.void_essence) & self.has(Loot.solar_essence), + SVEForage.void_pebble: self.region.can_reach( + SVERegion.crimson_badlands) & self.combat.has_galaxy_weapon(), + SVEVegetable.void_root: self.season.has(Season.winter) & self.has(ModLoot.void_seed), + "Void Salmon Sushi": self.has(Fish.void_salmon) & self.has("Void Mayonnaise") & self.has("Seaweed"), + ModLoot.void_seed: self.region.can_reach(SVERegion.highlands_cavern) & self.combat.has_good_weapon(), + SVEForage.void_soul: self.region.can_reach(SVERegion.crimson_badlands) & self.combat.has_good_weapon() & + self.cooking.can_cook(), + }) + + return items diff --git a/worlds/stardew_valley/mods/logic/mod_logic.py b/worlds/stardew_valley/mods/logic/mod_logic.py index 9ecbf43394f..07eb795d8f3 100644 --- a/worlds/stardew_valley/mods/logic/mod_logic.py +++ b/worlds/stardew_valley/mods/logic/mod_logic.py @@ -3,48 +3,61 @@ from .buildings_logic import ModBuildingLogic from .deepwoods_logic import DeepWoodsLogic from .elevator_logic import ModElevatorLogic +from .item_logic import ModItemLogic from .magic_logic import MagicLogic -from .quests_logic import QuestLogic +from .quests_logic import ModQuestLogic from .skills_logic import ModSkillLogic from .special_orders_logic import ModSpecialOrderLogic +from .sve_logic import SVELogic from ...logic.ability_logic import AbilityLogic from ...logic.action_logic import ActionLogic +from ...logic.artisan_logic import ArtisanLogic from ...logic.building_logic import BuildingLogic from ...logic.combat_logic import CombatLogic from ...logic.cooking_logic import CookingLogic +from ...logic.crafting_logic import CraftingLogic +from ...logic.crop_logic import CropLogic from ...logic.fishing_logic import FishingLogic from ...logic.has_logic import HasLogic from ...logic.mine_logic import MineLogic from ...logic.money_logic import MoneyLogic +from ...logic.quest_logic import QuestLogic from ...logic.received_logic import ReceivedLogic from ...logic.region_logic import RegionLogic from ...logic.relationship_logic import RelationshipLogic from ...logic.season_logic import SeasonLogic from ...logic.skill_logic import SkillLogic +from ...logic.time_logic import TimeLogic from ...logic.tool_logic import ToolLogic from ...logic.wallet_logic import WalletLogic from ...options import SkillProgression, ElevatorProgression, Mods class ModLogic: - quests: QuestLogic + items: ModItemLogic + quests: ModQuestLogic + region: RegionLogic magic: MagicLogic buildings: ModBuildingLogic special_orders: ModSpecialOrderLogic elevator: ModElevatorLogic deepwoods: DeepWoodsLogic skill: ModSkillLogic + sve: SVELogic def __init__(self, player: int, skill_option: SkillProgression, elevator_option: ElevatorProgression, mods: Mods, received: ReceivedLogic, has: HasLogic, region: RegionLogic, - action: ActionLogic, season: SeasonLogic, money: MoneyLogic, relationship: RelationshipLogic, building: BuildingLogic, wallet: WalletLogic, - combat: CombatLogic, tool: ToolLogic, skill: SkillLogic, fishing: FishingLogic, cooking: CookingLogic, mine: MineLogic, ability: AbilityLogic): + action: ActionLogic, artisan: ArtisanLogic, season: SeasonLogic, money: MoneyLogic, relationship: RelationshipLogic, building: BuildingLogic, wallet: WalletLogic, + combat: CombatLogic, tool: ToolLogic, skill: SkillLogic, fishing: FishingLogic, cooking: CookingLogic, mine: MineLogic, ability: AbilityLogic, + time: TimeLogic, quest: QuestLogic, crafting: CraftingLogic, crop: CropLogic): + self.item = ModItemLogic(mods,combat, cooking, has, money, region, season, relationship, tool) self.magic = MagicLogic(player, mods, received, region) - self.quests = QuestLogic(mods, has, region, season, relationship) + self.quests = ModQuestLogic(mods, has, region, season, relationship, received, time) self.buildings = ModBuildingLogic(player, has, money, mods) - self.special_orders = ModSpecialOrderLogic(player, has, region, relationship, wallet, mods) + self.special_orders = ModSpecialOrderLogic(player, action, artisan, crafting, crop, has, region, relationship, season, wallet, mods) self.elevator = ModElevatorLogic(player, elevator_option, mods, received) self.deepwoods = DeepWoodsLogic(player, skill_option, elevator_option, received, has, combat, tool, skill, cooking) self.skill = ModSkillLogic(player, skill_option, received, has, region, action, relationship, building, tool, fishing, cooking, self.magic, mods) + self.sve = SVELogic(player, skill_option, received, has, quest, region, action, relationship, building, tool, fishing, cooking, money, combat, season, time) combat.set_magic(self.magic) tool.set_magic(self.magic) ability.set_magic(self.magic, self.skill) diff --git a/worlds/stardew_valley/mods/logic/quests_logic.py b/worlds/stardew_valley/mods/logic/quests_logic.py index b01618cddff..238d0b8c190 100644 --- a/worlds/stardew_valley/mods/logic/quests_logic.py +++ b/worlds/stardew_valley/mods/logic/quests_logic.py @@ -4,33 +4,46 @@ from ...logic.region_logic import RegionLogic from ...logic.relationship_logic import RelationshipLogic from ...logic.season_logic import SeasonLogic +from ...logic.received_logic import ReceivedLogic +from ...logic.time_logic import TimeLogic from ...options import Mods from ...strings.quest_names import ModQuest from ..mod_data import ModNames +from ...strings.artisan_good_names import ArtisanGood +from ...strings.crop_names import Fruit from ...strings.food_names import Meal, Beverage -from ...strings.monster_drop_names import Loot +from ...strings.forageable_names import SVEForage +from ...strings.monster_drop_names import Loot, ModLoot from ...strings.villager_names import ModNPC from ...strings.season_names import Season -from ...strings.region_names import Region +from ...strings.region_names import Region, SVERegion +from ...strings.material_names import Material +from ...strings.metal_names import Ore, MetalBar +from ...strings.wallet_item_names import Wallet from ...stardew_rule import StardewRule -class QuestLogic: +class ModQuestLogic: mods: Mods has: HasLogic region: RegionLogic season: SeasonLogic relationship: RelationshipLogic + received: ReceivedLogic + time: TimeLogic - def __init__(self, mods: Mods, has: HasLogic, region: RegionLogic, season: SeasonLogic, relationship: RelationshipLogic): + def __init__(self, mods: Mods, has: HasLogic, region: RegionLogic, season: SeasonLogic, relationship: RelationshipLogic, + received: ReceivedLogic, time: TimeLogic): self.mods = mods self.has = has self.region = region self.season = season self.relationship = relationship + self.received = received + self.time = time def get_modded_quest_rules(self) -> Dict[str, StardewRule]: - quests = {} + quests = dict() if ModNames.juna in self.mods: quests.update({ ModQuest.JunaCola: self.relationship.has_hearts(ModNPC.juna, 3) & self.has(Beverage.joja_cola), @@ -48,4 +61,17 @@ def get_modded_quest_rules(self) -> Dict[str, StardewRule]: ModQuest.AyeishaRing: self.season.has(Season.winter) & self.region.can_reach(Region.forest) }) + if ModNames.sve in self.mods: + quests.update({ + ModQuest.RailroadBoulder: self.received(Wallet.skull_key) & self.has([Ore.iridium, Material.coal]) & + self.region.can_reach(Region.blacksmith) & self.region.can_reach(Region.railroad), + ModQuest.GrandpasShed: self.has([Material.hardwood, MetalBar.iron, ArtisanGood.battery_pack, Material.stone]) & + self.region.can_reach(SVERegion.grandpas_shed_interior), + ModQuest.MarlonsBoat: self.has([Loot.void_essence, Loot.solar_essence, Loot.slime, Loot.bat_wing, Loot.bug_meat]) & + self.relationship.can_meet(ModNPC.lance) & self.region.can_reach(SVERegion.guild_summit), + ModQuest.AuroraVineyard: self.has(Fruit.starfruit) & self.region.can_reach(SVERegion.aurora_vineyard), + ModQuest.MonsterCrops: self.has([ModLoot.monster_mushroom, ModLoot.slime_berry, ModLoot.monster_fruit, ModLoot.void_root]), + ModQuest.VoidSoul: self.region.can_reach(Region.sewer) & self.has(SVEForage.void_soul), + }) + return quests diff --git a/worlds/stardew_valley/mods/logic/special_orders_logic.py b/worlds/stardew_valley/mods/logic/special_orders_logic.py index a99d5ab90a3..121bff87a77 100644 --- a/worlds/stardew_valley/mods/logic/special_orders_logic.py +++ b/worlds/stardew_valley/mods/logic/special_orders_logic.py @@ -1,15 +1,27 @@ from typing import Iterable +from ...logic.action_logic import ActionLogic +from ...logic.artisan_logic import ArtisanLogic +from ...logic.crafting_logic import CraftingLogic +from ...logic.crop_logic import CropLogic from ...logic.has_logic import HasLogic from ...logic.region_logic import RegionLogic from ...logic.relationship_logic import RelationshipLogic +from ...logic.season_logic import SeasonLogic from ...logic.wallet_logic import WalletLogic from ...options import Mods -from ...strings.craftable_names import Consumable, Edible +from ...strings.artisan_good_names import ArtisanGood +from ...strings.craftable_names import Consumable, Edible, Bomb +from ...strings.fertilizer_names import Fertilizer +from ...strings.flower_names import Flower from ...strings.food_names import Meal +from ...strings.crop_names import Fruit +from ...strings.geode_names import Geode +from ...strings.machine_names import Machine from ...strings.material_names import Material +from ...strings.metal_names import MetalBar from ...strings.monster_drop_names import Loot -from ...strings.region_names import Region +from ...strings.region_names import Region, SVERegion from ...strings.special_order_names import SpecialOrder, ModSpecialOrder from ...strings.villager_names import ModNPC from ..mod_data import ModNames @@ -17,17 +29,28 @@ class ModSpecialOrderLogic: player: int + action: ActionLogic + artisan: ArtisanLogic + crafting: CraftingLogic + crop: CropLogic has: HasLogic region: RegionLogic relationship: RelationshipLogic + season: SeasonLogic wallet: WalletLogic mods_option: Mods - def __init__(self, player: int, has: HasLogic, region: RegionLogic, relationship: RelationshipLogic, wallet: WalletLogic, mods_option: Mods): + def __init__(self, player: int, action: ActionLogic, artisan: ArtisanLogic, crafting: CraftingLogic, crop: CropLogic, has: HasLogic, region: RegionLogic, relationship: RelationshipLogic, + season: SeasonLogic, wallet: WalletLogic, mods_option: Mods): self.player = player + self.action = action + self.artisan = artisan + self.crafting = crafting + self.crop = crop self.has = has self.region = region self.relationship = relationship + self.season = season self.wallet = wallet self.mods_option = mods_option @@ -42,5 +65,18 @@ def get_modded_special_orders_rules(self, vanilla_rules): self.has("Energy Tonic") & self.has(Material.sap) & self.has(Loot.bug_meat) & self.has(Edible.oil_of_garlic) & self.has(Meal.strange_bun) }) + if ModNames.sve in self.mods_option: + special_orders.update({ + ModSpecialOrder.andys_cellar: self.has(Material.stone) & self.has(Material.wood) & self.has(Material.hardwood) & self.has(MetalBar.iron) & + self.region.can_reach(SVERegion.fairhaven_farm), + ModSpecialOrder.a_mysterious_venture: self.has(Bomb.cherry_bomb) & self.has(Bomb.bomb) & self.has(Bomb.mega_bomb) & + self.region.can_reach(Region.adventurer_guild), + ModSpecialOrder.an_elegant_reception: self.artisan.can_keg(Fruit.starfruit) & self.has(ArtisanGood.cheese) & + self.has(ArtisanGood.goat_cheese) & self.season.has_any_not_winter() & self.region.can_reach(SVERegion.jenkins_cellar), + ModSpecialOrder.fairy_garden: self.has(Consumable.fairy_dust) & + self.region.can_reach(Region.island_south) & (self.action.can_open_geode(Geode.frozen) | self.action.can_open_geode(Geode.omni)) & + self.region.can_reach(SVERegion.blue_moon_vineyard), + ModSpecialOrder.homemade_fertilizer: self.has(Fertilizer.quality) & self.region.can_reach(SVERegion.susans_house) + }) return special_orders diff --git a/worlds/stardew_valley/mods/logic/sve_logic.py b/worlds/stardew_valley/mods/logic/sve_logic.py new file mode 100644 index 00000000000..d63373b4823 --- /dev/null +++ b/worlds/stardew_valley/mods/logic/sve_logic.py @@ -0,0 +1,85 @@ +from typing import Dict +from dataclasses import field, dataclass + +from ...logic.action_logic import ActionLogic +from ...logic.building_logic import BuildingLogic +from ...logic.combat_logic import CombatLogic +from ...logic.cooking_logic import CookingLogic +from ...logic.fishing_logic import FishingLogic +from ...logic.has_logic import HasLogic +from ...logic.money_logic import MoneyLogic +from ...logic.quest_logic import QuestLogic +from ...logic.received_logic import ReceivedLogic +from ...logic.region_logic import RegionLogic +from ...logic.relationship_logic import RelationshipLogic +from ...logic.season_logic import SeasonLogic +from ...logic.time_logic import TimeLogic +from ...logic.tool_logic import ToolLogic +from ..mod_regions import SVERegion +from ...options import SkillProgression +from ...stardew_rule import StardewRule, Or + + +class SVELogic: + player: int + received: ReceivedLogic + has: HasLogic + quest: QuestLogic + region: RegionLogic + relationship: RelationshipLogic + time: TimeLogic + tool: ToolLogic + fishing: FishingLogic + cooking: CookingLogic + money: MoneyLogic + combat: CombatLogic + season: SeasonLogic + sve_location_rules: Dict[str, StardewRule] + + def __init__(self, player: int, skill_option: SkillProgression, received: ReceivedLogic, has: HasLogic, quest: QuestLogic, region: RegionLogic, action: ActionLogic, + relationship: RelationshipLogic, building: BuildingLogic, tool: ToolLogic, fishing: FishingLogic, cooking: CookingLogic, + money: MoneyLogic, combat: CombatLogic, season: SeasonLogic, time: TimeLogic): + self.player = player + self.skill_option = skill_option + self.received = received + self.has = has + self.quest = quest + self.region = region + self.action = action + self.relationship = relationship + self.building = building + self.tool = tool + self.fishing = fishing + self.cooking = cooking + self.time = time + self.money = money + self.combat = combat + self.season = season + self.sve_location_rules = dict() + + def initialize_rules(self): + self.sve_location_rules.update({ + "Bear: Baked Berry Oatmeal Recipe": self.quest.can_complete_quest("Strange Note") & self.money.can_spend( + 12500), + "Bear: Flower Cookie Recipe": self.quest.can_complete_quest("Strange Note") & self.money.can_spend(8750), + "Purple Junimo: Super Starfruit": self.relationship.has_hearts("Apples", 10) & + self.region.can_reach( + SVERegion.purple_junimo_shop) & self.money.can_spend(80000), + "Alesia: Tempered Galaxy Dagger": self.region.can_reach( + SVERegion.alesia_shop) & self.combat.has_galaxy_weapon() & + self.money.can_spend(350000) & self.time.has_lived_months(3), + "Issac: Tempered Galaxy Sword": self.region.can_reach( + SVERegion.issac_shop) & self.combat.has_galaxy_weapon() & + self.money.can_spend(600000), + "Issac: Tempered Galaxy Hammer": self.region.can_reach( + SVERegion.issac_shop) & self.combat.has_galaxy_weapon() & + self.money.can_spend(400000), + "Lance's Diamond Wand": self.quest.can_complete_quest("Monster Crops") & self.region.can_reach( + SVERegion.lances_house), + }) + + def has_any_rune(self): + rune_list = ["Nexus: Adventurer's Guild Runes", "Nexus: Junimo Woods Runes", "Nexus: Aurora Vineyard Runes", "Nexus: Sprite Spring Runes", + "Nexus: Outpost Runes"] + return Or([self.received(rune) for rune in rune_list]) + diff --git a/worlds/stardew_valley/mods/mod_data.py b/worlds/stardew_valley/mods/mod_data.py index 81c49894113..487fd64be55 100644 --- a/worlds/stardew_valley/mods/mod_data.py +++ b/worlds/stardew_valley/mods/mod_data.py @@ -21,3 +21,4 @@ class ModNames: ayeisha = "Ayeisha - The Postal Worker (Custom NPC)" riley = "Custom NPC - Riley" skull_cavern_elevator = "Skull Cavern Elevator" + sve = "Stardew Valley Expanded" diff --git a/worlds/stardew_valley/mods/mod_regions.py b/worlds/stardew_valley/mods/mod_regions.py index b05bc9538db..f272c520d02 100644 --- a/worlds/stardew_valley/mods/mod_regions.py +++ b/worlds/stardew_valley/mods/mod_regions.py @@ -1,8 +1,8 @@ -from ..strings.entrance_names import DeepWoodsEntrance, EugeneEntrance, \ - JasperEntrance, AlecEntrance, YobaEntrance, JunaEntrance, MagicEntrance, AyeishaEntrance, RileyEntrance +from ..strings.entrance_names import Entrance, DeepWoodsEntrance, EugeneEntrance, \ + JasperEntrance, AlecEntrance, YobaEntrance, JunaEntrance, MagicEntrance, AyeishaEntrance, RileyEntrance, SVEEntrance from ..strings.region_names import Region, DeepWoodsRegion, EugeneRegion, JasperRegion, \ - AlecRegion, YobaRegion, JunaRegion, MagicRegion, AyeishaRegion, RileyRegion -from ..region_classes import RegionData, ConnectionData, RandomizationFlag, ModRegionData + AlecRegion, YobaRegion, JunaRegion, MagicRegion, AyeishaRegion, RileyRegion, SVERegion +from ..region_classes import RegionData, ConnectionData, ModificationFlag, RandomizationFlag, ModRegionData from .mod_data import ModNames deep_woods_regions = [ @@ -131,6 +131,125 @@ flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA) ] +stardew_valley_expanded_regions = [ + RegionData(Region.backwoods, [SVEEntrance.backwoods_to_grove]), + RegionData(Region.bus_stop, [SVEEntrance.bus_stop_to_shed]), + RegionData(SVERegion.grandpas_shed, [SVEEntrance.grandpa_shed_to_interior, SVEEntrance.grandpa_shed_to_town]), + RegionData(SVERegion.grandpas_shed_interior, [SVEEntrance.to_grandpa_upstairs]), + RegionData(SVERegion.grandpas_shed_upstairs), + RegionData(Region.forest, + [SVEEntrance.forest_to_fairhaven, SVEEntrance.forest_to_west, SVEEntrance.forest_to_junimo, + SVEEntrance.forest_to_bmv, SVEEntrance.forest_to_marnie_shed]), + RegionData(SVERegion.marnies_shed), + RegionData(SVERegion.fairhaven_farm), + RegionData(Region.town, [SVEEntrance.town_to_bmv, SVEEntrance.town_to_jenkins, + SVEEntrance.town_to_bridge, SVEEntrance.town_to_plot]), + RegionData(SVERegion.blue_moon_vineyard, [SVEEntrance.bmv_to_sophia, SVEEntrance.bmv_to_beach]), + RegionData(SVERegion.sophias_house), + RegionData(SVERegion.jenkins_residence, [SVEEntrance.jenkins_to_cellar]), + RegionData(SVERegion.jenkins_cellar), + RegionData(SVERegion.unclaimed_plot, [SVEEntrance.plot_to_bridge]), + RegionData(SVERegion.shearwater), + RegionData(Region.mountain, [SVEEntrance.mountain_to_guild_summit]), + RegionData(SVERegion.guild_summit, [SVEEntrance.guild_to_interior, SVEEntrance.guild_to_mines, + SVEEntrance.summit_to_boat]), + RegionData(SVERegion.marlon_boat, [SVEEntrance.boat_to_highlands]), + RegionData(Region.railroad, [SVEEntrance.to_susan_house, SVEEntrance.enter_summit]), + RegionData(Region.wizard_basement, [SVEEntrance.wizard_to_fable_reef]), + RegionData(SVERegion.fable_reef, [SVEEntrance.fable_reef_to_guild]), + RegionData(SVERegion.first_slash_guild), + RegionData(SVERegion.highlands, [SVEEntrance.highlands_to_lance, SVEEntrance.highlands_to_cave]), + RegionData(SVERegion.highlands_cavern, [SVEEntrance.to_dwarf_prison]), + RegionData(SVERegion.dwarf_prison), + RegionData(SVERegion.lances_house, [SVEEntrance.lance_ladder_to_highlands]), + RegionData(SVERegion.forest_west, [SVEEntrance.forest_west_to_spring, SVEEntrance.west_to_aurora, + SVEEntrance.use_bear_shop]), + RegionData(SVERegion.aurora_vineyard, [SVEEntrance.to_aurora_basement]), + RegionData(SVERegion.aurora_vineyard_basement), + RegionData(Region.secret_woods, [SVEEntrance.secret_woods_to_west]), + RegionData(SVERegion.bear_shop), + RegionData(SVERegion.sprite_spring), + RegionData(SVERegion.junimo_woods, [SVEEntrance.use_purple_junimo]), + RegionData(SVERegion.purple_junimo_shop), + RegionData(SVERegion.enchanted_grove, [SVEEntrance.grove_to_outpost, SVEEntrance.grove_to_wizard, + SVEEntrance.grove_to_farm, SVEEntrance.grove_to_guild, SVEEntrance.grove_to_junimo, + SVEEntrance.grove_to_spring, SVEEntrance.grove_to_aurora]), + RegionData(SVERegion.galmoran_outpost, [SVEEntrance.outpost_to_badlands_entrance, SVEEntrance.use_alesia_shop, + SVEEntrance.use_issac_shop, SVEEntrance.to_outpost_roof]), + RegionData(SVERegion.outpost_roof), + RegionData(SVERegion.badlands_entrance, [SVEEntrance.badlands_entrance_to_badlands]), + RegionData(SVERegion.crimson_badlands, [SVEEntrance.badlands_to_cave]), + RegionData(SVERegion.badlands_cave), + RegionData(SVERegion.alesia_shop), + RegionData(SVERegion.issac_shop), + RegionData(SVERegion.summit), + RegionData(SVERegion.susans_house), + RegionData(Region.mountain, [Entrance.mountain_to_adventurer_guild, Entrance.mountain_to_the_mines], ModificationFlag.MODIFIED) + +] + +mandatory_sve_connections = [ + ConnectionData(SVEEntrance.town_to_jenkins, SVERegion.jenkins_residence, flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(SVEEntrance.jenkins_to_cellar, SVERegion.jenkins_cellar, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.forest_to_bmv, SVERegion.blue_moon_vineyard), + ConnectionData(SVEEntrance.bmv_to_beach, Region.beach), + ConnectionData(SVEEntrance.town_to_plot, SVERegion.unclaimed_plot), + ConnectionData(SVEEntrance.town_to_bmv, SVERegion.blue_moon_vineyard), + ConnectionData(SVEEntrance.town_to_bridge, SVERegion.shearwater), + ConnectionData(SVEEntrance.plot_to_bridge, SVERegion.shearwater), + ConnectionData(SVEEntrance.bus_stop_to_shed, SVERegion.grandpas_shed), + ConnectionData(SVEEntrance.grandpa_shed_to_interior, SVERegion.grandpas_shed_interior, flag=RandomizationFlag.NON_PROGRESSION| RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(SVEEntrance.to_grandpa_upstairs, SVERegion.grandpas_shed_upstairs, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.grandpa_shed_to_town, Region.town), + ConnectionData(SVEEntrance.bmv_to_sophia, SVERegion.sophias_house, flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(SVEEntrance.boat_to_highlands, SVERegion.highlands, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.guild_to_interior, Region.adventurer_guild, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.backwoods_to_grove, SVERegion.enchanted_grove, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(SVEEntrance.grove_to_outpost, SVERegion.galmoran_outpost, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.grove_to_wizard, Region.wizard_basement, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.grove_to_aurora, SVERegion.aurora_vineyard_basement, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.to_aurora_basement, SVERegion.aurora_vineyard_basement, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.grove_to_farm, Region.farm, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.grove_to_guild, Region.adventurer_guild, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.grove_to_junimo, SVERegion.junimo_woods, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.use_purple_junimo, SVERegion.purple_junimo_shop), + ConnectionData(SVEEntrance.grove_to_spring, SVERegion.sprite_spring, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.wizard_to_fable_reef, SVERegion.fable_reef, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.fable_reef_to_guild, SVERegion.first_slash_guild, flag=RandomizationFlag.NON_PROGRESSION), + ConnectionData(SVEEntrance.to_outpost_roof, SVERegion.outpost_roof, flag=RandomizationFlag.NON_PROGRESSION), + ConnectionData(SVEEntrance.outpost_to_badlands_entrance, SVERegion.badlands_entrance, flag=RandomizationFlag.NON_PROGRESSION), + ConnectionData(SVEEntrance.badlands_entrance_to_badlands, SVERegion.crimson_badlands, flag=RandomizationFlag.NON_PROGRESSION), + ConnectionData(SVEEntrance.badlands_to_cave, SVERegion.badlands_cave, flag=RandomizationFlag.NON_PROGRESSION), + ConnectionData(SVEEntrance.guild_to_mines, Region.mines, flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(SVEEntrance.mountain_to_guild_summit, SVERegion.guild_summit), + ConnectionData(SVEEntrance.summit_to_boat, SVERegion.marlon_boat), + ConnectionData(SVEEntrance.forest_to_west, SVERegion.forest_west), + ConnectionData(SVEEntrance.secret_woods_to_west, SVERegion.forest_west), + ConnectionData(SVEEntrance.west_to_aurora, SVERegion.aurora_vineyard, flag=RandomizationFlag.NON_PROGRESSION), + ConnectionData(SVEEntrance.forest_to_junimo, SVERegion.junimo_woods, flag=RandomizationFlag.NON_PROGRESSION), + ConnectionData(SVEEntrance.forest_to_marnie_shed, SVERegion.marnies_shed, flag=RandomizationFlag.NON_PROGRESSION), + ConnectionData(SVEEntrance.forest_west_to_spring, SVERegion.sprite_spring, flag=RandomizationFlag.NON_PROGRESSION), + ConnectionData(SVEEntrance.to_susan_house, SVERegion.susans_house, flag=RandomizationFlag.NON_PROGRESSION), + ConnectionData(SVEEntrance.enter_summit, SVERegion.summit, flag=RandomizationFlag.NON_PROGRESSION), + ConnectionData(SVEEntrance.forest_to_fairhaven, SVERegion.fairhaven_farm, flag=RandomizationFlag.NON_PROGRESSION), + ConnectionData(SVEEntrance.highlands_to_lance, SVERegion.lances_house, flag=RandomizationFlag.NON_PROGRESSION), + ConnectionData(SVEEntrance.lance_ladder_to_highlands, SVERegion.highlands, flag=RandomizationFlag.NON_PROGRESSION), + ConnectionData(SVEEntrance.highlands_to_cave, SVERegion.highlands_cavern, flag=RandomizationFlag.NON_PROGRESSION), + ConnectionData(SVEEntrance.use_bear_shop, SVERegion.bear_shop), + ConnectionData(SVEEntrance.use_purple_junimo, SVERegion.purple_junimo_shop), + ConnectionData(SVEEntrance.use_alesia_shop, SVERegion.alesia_shop), + ConnectionData(SVEEntrance.use_issac_shop, SVERegion.issac_shop), + ConnectionData(SVEEntrance.to_dwarf_prison, SVERegion.dwarf_prison, flag=RandomizationFlag.NON_PROGRESSION), +] + +remove_vanilla_connections = { + ModNames.sve: [ConnectionData(Entrance.mountain_to_the_mines, Region.mines, + flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.mountain_to_adventurer_guild, Region.adventurer_guild, + flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), + ] +} + ModDataList = { ModNames.deepwoods: ModRegionData(ModNames.deepwoods, deep_woods_regions, deep_woods_entrances), ModNames.eugene: ModRegionData(ModNames.eugene, eugene_regions, eugene_entrances), @@ -141,4 +260,5 @@ ModNames.magic: ModRegionData(ModNames.magic, magic_regions, magic_entrances), ModNames.ayeisha: ModRegionData(ModNames.ayeisha, ayeisha_regions, ayeisha_entrances), ModNames.riley: ModRegionData(ModNames.riley, riley_regions, riley_entrances), + ModNames.sve: ModRegionData(ModNames.sve, stardew_valley_expanded_regions, mandatory_sve_connections), } diff --git a/worlds/stardew_valley/options.py b/worlds/stardew_valley/options.py index 175308a9977..7a68da3cff9 100644 --- a/worlds/stardew_valley/options.py +++ b/worlds/stardew_valley/options.py @@ -493,6 +493,60 @@ class FriendsanityHeartSize(Range): # step = 1 +class Monstersanity(Choice): + """Locations for slaying monsters? + None: There are no checks for slaying monsters + One per category: Every category visible at the adventure guild gives one check + One per Monster: Every unique monster gives one check + Monster Eradication Goals: The Monster Eradication Goals each contain one check + Short Monster Eradication Goals: The Monster Eradication Goals each contain one check, but are reduced by 60% + Very Short Monster Eradication Goals: The Monster Eradication Goals each contain one check, but are reduced by 90% + Progressive Eradication Goals: The Monster Eradication Goals each contain 5 checks, each 20% of the way + Split Eradication Goals: The Monster Eradication Goals are split by monsters, each monster has one check + """ + internal_name = "monstersanity" + display_name = "Monstersanity" + default = 1 + option_none = 0 + option_one_per_category = 1 + option_one_per_monster = 2 + option_goals = 3 + option_short_goals = 4 + option_very_short_goals = 5 + option_progressive_goals = 6 + option_split_goals = 7 + + +class Shipsanity(Choice): + """Locations for shipping items? + None: There are no checks for shipping items + Crops: Every crop being shipped is a check + Quality Crops: Every crop being shipped is a check, but only granted if it is gold-quality + Fish: Every fish being shipped is a check except legendaries + Quality Fish: Every fish being shipped is a check except legendaries, but only granted if it is gold-quality + Full Shipment: Every item in the Collections page is a check + Quality Full Shipment: Every item in the Collections page is a check, but only granted if it is gold-quality when applicable + Full Shipment With Fish: Every item in the Collections page and every fish is a check + Quality Full Shipment With Fish: Every item in the Collections page and every fish is a check, but only granted if it is gold-quality when applicable + Everything: Every item in the game that can be shipped is a check + Quality Everything: Every item in the game that can be shipped is a check, but only granted if it is gold-quality when applicable + """ + internal_name = "shipsanity" + display_name = "Shipsanity" + default = 0 + option_none = 0 + option_crops = 1 + option_quality_crops = 2 + option_fish = 3 + option_quality_fish = 4 + option_full_shipment = 5 + option_quality_full_shipment = 6 + option_full_shipment_with_fish = 7 + option_quality_full_shipment_with_fish = 8 + option_everything = 9 + option_quality_everything = 10 + + class NumberOfMovementBuffs(Range): """Number of movement speed buffs to the player that exist as items in the pool. Each movement speed buff is a +25% multiplier that stacks additively""" @@ -644,7 +698,7 @@ class Mods(OptionSet): ModNames.cooking_skill, ModNames.binning_skill, ModNames.juna, ModNames.jasper, ModNames.alec, ModNames.yoba, ModNames.eugene, ModNames.wellwick, ModNames.ginger, ModNames.shiko, ModNames.delores, - ModNames.ayeisha, ModNames.riley, ModNames.skull_cavern_elevator + ModNames.ayeisha, ModNames.riley, ModNames.skull_cavern_elevator, ModNames.sve } diff --git a/worlds/stardew_valley/region_classes.py b/worlds/stardew_valley/region_classes.py index 9db322416a4..41ff65d1294 100644 --- a/worlds/stardew_valley/region_classes.py +++ b/worlds/stardew_valley/region_classes.py @@ -5,6 +5,10 @@ connector_keyword = " to " +class ModificationFlag(IntFlag): + NOT_MODIFIED = 0 + MODIFIED = 1 + class RandomizationFlag(IntFlag): NOT_RANDOMIZED = 0b0 PELICAN_TOWN = 0b11111 @@ -20,6 +24,7 @@ class RandomizationFlag(IntFlag): class RegionData: name: str exits: List[str] = field(default_factory=list) + flag: ModificationFlag = ModificationFlag.NOT_MODIFIED def get_merged_with(self, exits: List[str]): merged_exits = [] diff --git a/worlds/stardew_valley/regions.py b/worlds/stardew_valley/regions.py index 37874684f8d..a1a95043cda 100644 --- a/worlds/stardew_valley/regions.py +++ b/worlds/stardew_valley/regions.py @@ -5,8 +5,8 @@ from .options import EntranceRandomization, ExcludeGingerIsland, Museumsanity from .strings.entrance_names import Entrance from .strings.region_names import Region -from .region_classes import RegionData, ConnectionData, RandomizationFlag -from .mods.mod_regions import ModDataList +from .region_classes import RegionData, ConnectionData, RandomizationFlag, ModificationFlag +from .mods.mod_regions import ModDataList, remove_vanilla_connections class RegionFactory(Protocol): @@ -462,10 +462,12 @@ def create_final_regions(world_options) -> List[RegionData]: (region for region in final_regions if region.name == mod_region.name), None) if existing_region: final_regions.remove(existing_region) + if ModificationFlag.MODIFIED in mod_region.flag: + mod_region = modify_vanilla_regions(existing_region, mod_region) final_regions.append(existing_region.get_merged_with(mod_region.exits)) continue - final_regions.append(mod_region.get_clone()) + return final_regions @@ -477,10 +479,23 @@ def create_final_connections(world_options) -> List[ConnectionData]: for mod in world_options.mods.value: if mod not in ModDataList: continue + if mod in remove_vanilla_connections: + for connection_data in remove_vanilla_connections[mod]: + final_connections.remove(connection_data) final_connections.extend(ModDataList[mod].connections) return final_connections +def modify_vanilla_regions(existing_region: RegionData, modified_region: RegionData) -> RegionData: + + updated_region = existing_region + region_exits = updated_region.exits + modified_exits = modified_region.exits + for exits in modified_exits: + region_exits.remove(exits) + + return updated_region + def create_regions(region_factory: RegionFactory, random: Random, world_options) -> Tuple[ Iterable[Region], Dict[str, str]]: final_regions = create_final_regions(world_options) diff --git a/worlds/stardew_valley/rules.py b/worlds/stardew_valley/rules.py index 37877512c0d..c1b80b2e6e7 100644 --- a/worlds/stardew_valley/rules.py +++ b/worlds/stardew_valley/rules.py @@ -22,9 +22,11 @@ from .strings.artisan_good_names import ArtisanGood from .strings.building_names import Building from .strings.calendar_names import Weekday -from .strings.entrance_names import dig_to_mines_floor, dig_to_skull_floor, Entrance, move_to_woods_depth, DeepWoodsEntrance, AlecEntrance, MagicEntrance +from .strings.entrance_names import dig_to_mines_floor, dig_to_skull_floor, Entrance, move_to_woods_depth, DeepWoodsEntrance, AlecEntrance, MagicEntrance, \ + SVEEntrance from .strings.material_names import Material from .strings.metal_names import MetalBar +from .strings.quest_names import Quest, ModQuest from .strings.region_names import Region from .strings.season_names import Season from .strings.skill_names import ModSkill, Skill @@ -78,6 +80,7 @@ def set_rules(world): set_deepwoods_rules(logic, multiworld, player, world_options) set_magic_spell_rules(logic, multiworld, player, world_options) + set_sve_rules(logic, multiworld, player, world_options) # 1min52 - 1min53 # These times are for TestOptions # 1min36 - 1min38 # After the combat not duplicating a bunch of stuff # 1min28 - 1min30 # with the caching of combat rules @@ -135,7 +138,7 @@ def set_building_rules(logic: StardewLogic, multiworld, player, world_options: S def set_bundle_rules(current_bundles, logic: StardewLogic, multiworld, player): for bundle in current_bundles.values(): location = multiworld.get_location(bundle.get_name_with_bundle(), player) - rules = logic.can_complete_bundle(bundle.requirements, bundle.number_required) + rules = logic.bundle.can_complete_bundle(bundle.requirements, bundle.number_required) simplified_rules = rules.simplify() MultiWorldRules.set_rule(location, simplified_rules) MultiWorldRules.add_rule(multiworld.get_location("Complete Crafts Room", player), @@ -251,8 +254,7 @@ def set_entrance_rules(logic: StardewLogic, multiworld, player, world_options: S set_farm_buildings_entrance_rules(logic, multiworld, player) - MultiWorldRules.set_rule(multiworld.get_entrance(Entrance.mountain_to_adventurer_guild, player), - logic.received("Adventurer's Guild")) + set_adventure_guild_entrance_rules(logic, multiworld, player, world_options) MultiWorldRules.set_rule(multiworld.get_entrance(Entrance.mountain_to_railroad, player), logic.time.has_lived_months(2)) MultiWorldRules.set_rule(multiworld.get_entrance(Entrance.enter_witch_warp_cave, player), @@ -272,6 +274,14 @@ def set_entrance_rules(logic: StardewLogic, multiworld, player, world_options: S MultiWorldRules.set_rule(multiworld.get_entrance(Entrance.watch_queen_of_sauce, player), logic.action.can_watch(Channel.queen_of_sauce).simplify()) +def set_adventure_guild_entrance_rules(logic, multiworld, player, world_options): + if ModNames.sve in world_options.mods: + entrance = multiworld.get_entrance(SVEEntrance.guild_to_interior, player) + else: + entrance = multiworld.get_entrance(Entrance.mountain_to_adventurer_guild, player) + MultiWorldRules.set_rule(entrance, logic.received("Adventurer's Guild")) + + def set_farm_buildings_entrance_rules(logic, multiworld, player): MultiWorldRules.set_rule(multiworld.get_entrance(Entrance.use_desert_obelisk, player), logic.can_use_obelisk(Transportation.desert_obelisk).simplify()) MultiWorldRules.set_rule(multiworld.get_entrance(Entrance.use_island_obelisk, player), logic.can_use_obelisk(Transportation.island_obelisk).simplify()) @@ -427,7 +437,7 @@ def set_story_quests_rules(all_location_names: List[str], logic: StardewLogic, m for quest in locations.locations_by_tag[LocationTags.QUEST]: if quest.name in all_location_names and (quest.mod_name is None or quest.mod_name in world_options.mods): MultiWorldRules.set_rule(multiworld.get_location(quest.name, player), - logic.quest_rules[quest.name].simplify()) + logic.quest.quest_rules[quest.name].simplify()) def set_special_order_rules(all_location_names: List[str], logic: StardewLogic, multiworld, player, @@ -866,3 +876,58 @@ def set_magic_spell_rules(logic: StardewLogic, multiworld: MultiWorld, player: i logic.region.can_reach(Region.mines_floor_100) & logic.region.can_reach(Region.farm) & logic.time.has_lived_months(12) & logic.mod.magic.can_use_altar()).simplify()) + + +def set_sve_rules(logic: StardewLogic, multiworld: MultiWorld, player: int, world_options: StardewValleyOptions): + if ModNames.sve not in world_options.mods: + return + MultiWorldRules.set_rule(multiworld.get_entrance(SVEEntrance.forest_to_junimo, player), + logic.received("Abandoned House Outskirts Clean-up").simplify()) + MultiWorldRules.set_rule(multiworld.get_entrance(SVEEntrance.enter_summit, player), + logic.received("Iridium Bomb").simplify()) + MultiWorldRules.set_rule(multiworld.get_entrance(SVEEntrance.use_bear_shop, player), + logic.quest.can_complete_quest(Quest.strange_note).simplify()) + MultiWorldRules.set_rule(multiworld.get_entrance(SVEEntrance.backwoods_to_grove, player), + logic.mod.sve.has_any_rune().simplify()) + MultiWorldRules.set_rule(multiworld.get_entrance(SVEEntrance.forest_west_to_spring, player), + logic.quest.can_complete_quest(Quest.magic_ink).simplify()) + MultiWorldRules.set_rule(multiworld.get_entrance(SVEEntrance.secret_woods_to_west, player), + logic.tool.has_tool(Tool.axe, ToolMaterial.iron).simplify()) + MultiWorldRules.set_rule(multiworld.get_entrance(SVEEntrance.wizard_to_fable_reef, player), + logic.received("Fable Reef Portal").simplify()) + MultiWorldRules.set_rule(multiworld.get_entrance(SVEEntrance.grandpa_shed_to_interior, player), + logic.tool.has_tool(Tool.axe, ToolMaterial.iron).simplify()) + MultiWorldRules.set_rule(multiworld.get_entrance(SVEEntrance.grove_to_aurora, player), + logic.received("Nexus: Aurora Vineyard Runes").simplify()) + MultiWorldRules.set_rule(multiworld.get_entrance(SVEEntrance.grove_to_farm, player), + logic.mod.sve.has_any_rune().simplify()) + MultiWorldRules.set_rule(multiworld.get_entrance(SVEEntrance.grove_to_guild, player), + logic.received("Nexus: Adventurer's Guild Runes").simplify()) + MultiWorldRules.set_rule(multiworld.get_entrance(SVEEntrance.grove_to_junimo, player), + logic.received("Nexus: Junimo Woods Runes").simplify()) + MultiWorldRules.set_rule(multiworld.get_entrance(SVEEntrance.grove_to_spring, player), + logic.received("Nexus: Sprite Spring Runes").simplify()) + MultiWorldRules.set_rule(multiworld.get_entrance(SVEEntrance.grove_to_outpost, player), + logic.received("Nexus: Outpost Runes").simplify()) + MultiWorldRules.set_rule(multiworld.get_entrance(SVEEntrance.grove_to_wizard, player), + logic.mod.sve.has_any_rune().simplify()) + MultiWorldRules.set_rule(multiworld.get_entrance(SVEEntrance.use_purple_junimo, player), + logic.relationship.has_hearts(ModNPC.apples, 10).simplify()) + MultiWorldRules.set_rule(multiworld.get_entrance(SVEEntrance.to_grandpa_upstairs, player), + logic.quest.can_complete_quest("Grandpa's Shed").simplify()) + MultiWorldRules.set_rule(multiworld.get_entrance(SVEEntrance.highlands_to_cave, player), + logic.tool.has_tool(Tool.pickaxe, ToolMaterial.iron).simplify()) + for location in logic.mod.sve.sve_location_rules: + MultiWorldRules.set_rule(multiworld.get_location(location, player), + logic.mod.sve.sve_location_rules[location].simplify()) + set_sve_ginger_island_rules(logic, multiworld, player, world_options) + + +def set_sve_ginger_island_rules(logic: StardewLogic, multiworld: MultiWorld, player: int, world_options: StardewValleyOptions): + if world_options.exclude_ginger_island == ExcludeGingerIsland.option_true: + return + MultiWorldRules.set_rule(multiworld.get_entrance(SVEEntrance.summit_to_boat, player), + logic.received("Marlon's Boat Paddle").simplify()) + MultiWorldRules.set_rule(multiworld.get_entrance(SVEEntrance.wizard_to_fable_reef, player), + logic.received("Fable Reef Portal").simplify()) + diff --git a/worlds/stardew_valley/strings/crop_names.py b/worlds/stardew_valley/strings/crop_names.py index 646f19dd4bc..a2668650bc3 100644 --- a/worlds/stardew_valley/strings/crop_names.py +++ b/worlds/stardew_valley/strings/crop_names.py @@ -58,3 +58,14 @@ class Vegetable: yam = veggie("Yam") radish = veggie("Radish") taro_root = veggie("Taro Root") + + +class SVEFruit: + slime_berry = "Slime Berry" + monster_fruit = "Monster Fruit" + + +class SVEVegetable: + monster_mushroom = "Monster Mushroom" + void_root = "Void Root" + diff --git a/worlds/stardew_valley/strings/entrance_names.py b/worlds/stardew_valley/strings/entrance_names.py index 58b632f28d2..e4b2225ac28 100644 --- a/worlds/stardew_valley/strings/entrance_names.py +++ b/worlds/stardew_valley/strings/entrance_names.py @@ -244,3 +244,58 @@ class AyeishaEntrance: class RileyEntrance: town_to_riley = "Town to Riley's House" + +class SVEEntrance: + backwoods_to_grove = "Backwoods to Enchanted Grove" + grove_to_outpost = "Enchanted Grove to Galmoran Outpost" + grove_to_wizard = "Enchanted Grove to Wizard's Tower" + grove_to_aurora = "Enchanted Grove to Aurora Vineyard Basement" + grove_to_farm = "Enchanted Grove to Farm" + grove_to_guild = "Enchanted Grove to Adventurer's Guild Summit" + grove_to_junimo = "Enchanted Grove to Junimo Woods" + grove_to_spring = "Enchanted Grove to Sprite Springs" + wizard_to_fable_reef = "Wizard's Basement to Fable Reef" + bus_stop_to_shed = "Bus Stop to Grandpa's Shed" + grandpa_shed_to_interior = "Grandpa's Shed to Grandpa's Shed Interior" + grandpa_shed_to_town = "Grandpa's Shed to Town" + to_grandpa_upstairs = "Grandpa's Shed to Grandpa's Shed Upstairs" + forest_to_fairhaven = "Forest to Fairhaven Farm" + forest_to_west = "Forest to Forest West" + forest_to_junimo = "Forest to Junimo Woods" + use_purple_junimo = "Talk to Purple Junimo" + forest_to_bmv = "Forest to Blue Moon Vineyard" + forest_to_marnie_shed = "Forest to Marnie's Shed" + town_to_bmv = "Town to Blue Moon Vineyard" + town_to_jenkins = "Town to Jenkins' Residence" + town_to_bridge = "Town to Shearwater Bridge" + town_to_plot = "Town to Unclaimed Plot" + bmv_to_sophia = "Blue Moon Vineyard to Sophia's House" + bmv_to_beach = "Blue Moon Vineyard to Beach" + jenkins_to_cellar = "Jenkins' House to Jenkins' Cellar" + plot_to_bridge = "Unclaimed Plot to Shearwater Bridge" + mountain_to_guild_summit = "Mountain to Adventurer's Guild Summit" + guild_to_interior = "Adventurer's Guild Summit to Adventurer's Guild" + guild_to_mines = "Adventurer's Guild Summit to The Mines" + summit_to_boat = "Adventurer's Guild Summit to Marlon's Boat" + boat_to_highlands = "Marlon's Boat to Highlands" + to_aurora_basement = "Aurora Vineyard to Aurora Vineyard Basement" + outpost_to_badlands_entrance = "Galmoran Outpost to Badlands Entrance" + use_alesia_shop = "Talk to Alesia" + use_issac_shop = "Talk to Issac" + badlands_entrance_to_badlands = "Badlands Entrance to Crimson Badlands" + badlands_to_cave = "Crimson Badlands to Badlands Cave" + to_susan_house = "Railroad to Susan's House" + enter_summit = "Railroad to Summit" + fable_reef_to_guild = "Fable Reef to First Slash Guild" + highlands_to_lance = "Highlands to Lance's House Main" + highlands_to_cave = "Highlands to Highlands Cave" + to_dwarf_prison = "Highlands Cave to Dwarf Prison" + lance_ladder_to_highlands = "Lance's House Ladder to Highlands" + forest_west_to_spring = "Forest West to Sprite Springs" + west_to_aurora = "Forest West to Aurora Vineyard" + use_bear_shop = "Talk to Bear Shop" + secret_woods_to_west = "Secret Woods to Forest West" + to_outpost_roof = "Galmoran Outpost to Galmoran Outpost Roof" + + + diff --git a/worlds/stardew_valley/strings/fish_names.py b/worlds/stardew_valley/strings/fish_names.py index 511745265be..58b771dc87e 100644 --- a/worlds/stardew_valley/strings/fish_names.py +++ b/worlds/stardew_valley/strings/fish_names.py @@ -1,4 +1,28 @@ class Fish: + spook_fish = "Spook Fish" + midnight_squid = "Midnight Squid" + blob_fish = "Blobfish" + woodskip = "Woodskip" + walleye = "Walleye" + tilapia = "Tilapia" + tiger_trout = "Tiger Trout" + super_cucumber = "Super Cucumber" + stonefish = "Stonefish" + slimejack = "Slimejack" + shad = "Shad" + scorpion_carp = "Scorpion Carp" + sandfish = "Sandfish" + red_snapper = "Red Snapper" + red_mullet = "Red Mullet" + pike = "Pike" + perch = "Perch" + ice_pip = "Ice Pip" + herring = "Herring" + halibut = "Halibut" + ghostfish = "Ghostfish" + chub = "Chub" + bullhead = "Bullhead" + anchovy = "Anchovy" albacore = "Albacore" angler = "Angler" any = "Any Fish" @@ -7,6 +31,8 @@ class Fish: bream = "Bream" carp = "Carp" catfish = "Catfish" + clam = "Clam" + cockle = "Cockle" crab = "Crab" crayfish = "Crayfish" crimsonfish = "Crimsonfish" @@ -20,6 +46,7 @@ class Fish: legend = "Legend" legend_ii = "Legend II" lionfish = "Lionfish" + lingcod = "Lingcod" lobster = "Lobster" midnight_carp = "Midnight Carp" ms_angler = "Ms. Angler" @@ -52,8 +79,6 @@ class WaterItem: seaweed = "Seaweed" green_algae = "Green Algae" white_algae = "White Algae" - clam = "Clam" - cockle = "Cockle" coral = "Coral" nautilus_shell = "Nautilus Shell" sea_urchin = "Sea Urchin" @@ -73,5 +98,35 @@ class WaterChest: treasure = "Treasure Chest" +class SVEFish: + baby_lunaloo = "Baby Lunaloo" + bonefish = "Bonefish" + bull_trout = "Bull Trout" + butterfish = "Butterfish" + clownfish = "Clownfish" + daggerfish = "Daggerfish" + frog = "Frog" + gemfish = "Gemfish" + goldenfish = "Goldenfish" + grass_carp = "Grass Carp" + king_salmon = "King Salmon" + kittyfish = "Kittyfish" + lunaloo = "Lunaloo" + meteor_carp = "Meteor Carp" + minnow = "Minnow" + puppyfish = "Puppyfish" + radioactive_bass = "Radioactive Bass" + seahorse = "Seahorse" + shiny_lunaloo = "Shiny Lunaloo" + snatcher_worm = "Snatcher Worm" + starfish = "Starfish" + torpedo_trout = "Torpedo Trout" + undeadfish = "Undeadfish" + void_eel = "Void Eel" + water_grub = "Water Grub" + sea_sponge = "Sea Sponge" + dulse_seaweed = "Dulse Seaweed" + + diff --git a/worlds/stardew_valley/strings/forageable_names.py b/worlds/stardew_valley/strings/forageable_names.py index e482d3ef155..163ce7ab5d6 100644 --- a/worlds/stardew_valley/strings/forageable_names.py +++ b/worlds/stardew_valley/strings/forageable_names.py @@ -33,4 +33,8 @@ class Forageable: spring_onion = "Spring Onion" - +class SVEForage: + ornate_treasure_chest = "Ornate Treasure Chest" + swirl_stone = "Swirl Stone" + void_pebble = "Void Pebble" + void_soul = "Void Soul" diff --git a/worlds/stardew_valley/strings/monster_drop_names.py b/worlds/stardew_valley/strings/monster_drop_names.py index 1b9f42429d0..9f370829afb 100644 --- a/worlds/stardew_valley/strings/monster_drop_names.py +++ b/worlds/stardew_valley/strings/monster_drop_names.py @@ -4,3 +4,14 @@ class Loot: bat_wing = "Bat Wing" solar_essence = "Solar Essence" void_essence = "Void Essence" + + +class ModLoot: + void_root = "Void Root" + monster_fruit = "Monster Fruit" + slime_berry = "Slime Berry" + monster_mushroom = "Monster Mushroom" + stalk_seed = "Stalk Seed" + fungus_seed = "Fungus Seed" + slime_seed = "Slime Seed" + void_seed = "Void Seed" diff --git a/worlds/stardew_valley/strings/quest_names.py b/worlds/stardew_valley/strings/quest_names.py index 112e40a5d84..92c3606fe2e 100644 --- a/worlds/stardew_valley/strings/quest_names.py +++ b/worlds/stardew_valley/strings/quest_names.py @@ -49,9 +49,16 @@ class Quest: goblin_problem = "Goblin Problem" magic_ink = "Magic Ink" + class ModQuest: MrGinger = "Mr.Ginger's request" AyeishaEnvelope = "Missing Envelope" AyeishaRing = "Lost Emerald Ring" JunaCola = "Juna's Drink Request" - JunaSpaghetti = "Juna's BFF Request" \ No newline at end of file + JunaSpaghetti = "Juna's BFF Request" + RailroadBoulder = "The Railroad Boulder" + GrandpasShed = "Grandpa's Shed" + MarlonsBoat = "Marlon's Boat" + AuroraVineyard = "Aurora Vineyard" + MonsterCrops = "Monster Crops" + VoidSoul = "Void Soul" \ No newline at end of file diff --git a/worlds/stardew_valley/strings/region_names.py b/worlds/stardew_valley/strings/region_names.py index 0fbe7404e3c..4a1e54d5fd9 100644 --- a/worlds/stardew_valley/strings/region_names.py +++ b/worlds/stardew_valley/strings/region_names.py @@ -203,3 +203,43 @@ class AyeishaRegion: class RileyRegion: riley_house = "Riley's House" + + +class SVERegion: + grandpas_shed = "Grandpa's Shed" + grandpas_shed_interior = "Grandpa's Shed Interior" + grandpas_shed_upstairs = "Grandpa's Shed Upstairs" + marnies_shed = "Marnie's Shed" + fairhaven_farm = "Fairhaven Farm" + blue_moon_vineyard = "Blue Moon Vineyard" + sophias_house = "Sophia's House" + jenkins_residence = "Jenkins' Residence" + jenkins_cellar = "Jenkins' Cellar" + unclaimed_plot = "Unclaimed Plot" + shearwater = "Shearwater Bridge" + guild_summit = "Adventurer's Guild Summit" + fable_reef = "Fable Reef" + first_slash_guild = "First Slash Guild" + highlands = "Highlands" + highlands_cavern = "Highlands Cavern" + dwarf_prison = "Drawf Prison" + lances_house = "Lance's House" + forest_west = "Forest West" + aurora_vineyard = "Aurora Vineyard" + aurora_vineyard_basement = "Aurora Vineyard Basement" + bear_shop = "Bear Shop" + sprite_spring = "Sprite Spring" + junimo_woods = "Junimo Woods" + purple_junimo_shop = "Purple Junimo Shop" + enchanted_grove = "Enchanted Grove" + galmoran_outpost = "Galmoran Outpost" + badlands_entrance = "Badlands Entrance" + crimson_badlands = "Crimson Badlands" + alesia_shop = "Alesia Shop" + issac_shop = "Issac Shop" + summit = "Summit" + susans_house = "Susan's House" + marlon_boat = "Marlon's Boat" + badlands_cave = "Badlands Cave" + outpost_roof = "Galmoran Outpost Roof" + diff --git a/worlds/stardew_valley/strings/special_order_names.py b/worlds/stardew_valley/strings/special_order_names.py index f7b49cdf05e..76cd9634e3d 100644 --- a/worlds/stardew_valley/strings/special_order_names.py +++ b/worlds/stardew_valley/strings/special_order_names.py @@ -31,3 +31,8 @@ class SpecialOrder: class ModSpecialOrder: junas_monster_mash = "Juna's Monster Mash" + andys_cellar = "Andy's Cellar" + a_mysterious_venture = "A Mysterious Venture" + an_elegant_reception = "An Elegant Reception" + fairy_garden = "Fairy Garden" + homemade_fertilizer = "Homemade Fertilizer" diff --git a/worlds/stardew_valley/strings/villager_names.py b/worlds/stardew_valley/strings/villager_names.py index 5bf13ea8dd7..61443aa5e13 100644 --- a/worlds/stardew_valley/strings/villager_names.py +++ b/worlds/stardew_valley/strings/villager_names.py @@ -46,4 +46,18 @@ class ModNPC: riley = "Riley" shiko = "Shiko" wellwick = "Wellwick" - yoba = "Yoba" \ No newline at end of file + yoba = "Yoba" + lance = "Lance" + apples = "Apples" + claire = "Claire" + olivia = "Olivia" + sophia = "Sophia" + victor = "Victor" + andy = "Andy" + gunther = "Gunther" + martin = "Martin" + marlon = "Marlon" + morgan = "Morgan" + morris = "Morris" + scarlett = "Scarlett" + susan = "Susan" diff --git a/worlds/stardew_valley/test/TestGeneration.py b/worlds/stardew_valley/test/TestGeneration.py index 1df16ab479d..d8e018d02a1 100644 --- a/worlds/stardew_valley/test/TestGeneration.py +++ b/worlds/stardew_valley/test/TestGeneration.py @@ -1,10 +1,11 @@ from typing import List from BaseClasses import ItemClassification, MultiWorld, Item -from . import setup_solo_multiworld, SVTestBase, get_minsanity_options +from . import setup_solo_multiworld, SVTestBase, get_minsanity_options, allsanity_options_without_mods, \ + allsanity_options_with_mods, minimal_locations_maximal_items from .. import locations, items, location_table, options from ..data.villagers_data import all_villagers_by_name, all_villagers_by_mod_by_name -from ..items import items_by_group, Group, item_table +from ..items import Group, item_table from ..locations import LocationTags from ..mods.mod_data import ModNames from ..options import Friendsanity, SpecialOrderLocations, Shipsanity, Chefsanity, SeasonRandomization, Craftsanity, ExcludeGingerIsland, ToolProgression, \ @@ -316,7 +317,7 @@ def test_all_location_created_are_in_location_table(self): class TestLocationAndItemCount(SVTestBase): def test_minimal_location_maximal_items_still_valid(self): - min_max_options = self.minimal_locations_maximal_items() + min_max_options = minimal_locations_maximal_items() multiworld = setup_solo_multiworld(min_max_options) valid_locations = get_real_locations(self, multiworld) number_locations = len(valid_locations) @@ -341,7 +342,7 @@ def test_minsanity_has_fewer_than_locations(self): def test_allsanity_without_mods_has_at_least_locations(self): expected_locations = 1948 - allsanity_options = self.allsanity_options_without_mods() + allsanity_options = allsanity_options_without_mods() multiworld = setup_solo_multiworld(allsanity_options) real_locations = get_real_locations(self, multiworld) number_locations = len(real_locations) @@ -355,7 +356,7 @@ def test_allsanity_without_mods_has_at_least_locations(self): def test_allsanity_with_mods_has_at_least_locations(self): expected_locations = 2200 - allsanity_options = self.allsanity_options_with_mods() + allsanity_options = allsanity_options_with_mods() multiworld = setup_solo_multiworld(allsanity_options) real_locations = get_real_locations(self, multiworld) number_locations = len(real_locations) diff --git a/worlds/stardew_valley/test/TestItems.py b/worlds/stardew_valley/test/TestItems.py index 35d2bb05673..7e7b6e3dbbf 100644 --- a/worlds/stardew_valley/test/TestItems.py +++ b/worlds/stardew_valley/test/TestItems.py @@ -6,7 +6,7 @@ from typing import Set from BaseClasses import ItemClassification, MultiWorld -from . import setup_solo_multiworld, SVTestBase +from . import setup_solo_multiworld, SVTestBase, allsanity_options_without_mods from .. import ItemData, StardewValleyWorld from ..items import Group, item_table @@ -46,14 +46,14 @@ def test_babies_come_in_all_shapes_and_sizes(self): def test_correct_number_of_stardrops(self): seed = random.randrange(sys.maxsize) - allsanity_options = self.allsanity_options_without_mods() + allsanity_options = allsanity_options_without_mods() multiworld = setup_solo_multiworld(allsanity_options, seed=seed) stardrop_items = [item for item in multiworld.get_items() if "Stardrop" in item.name] self.assertEqual(len(stardrop_items), 5) def test_no_duplicate_rings(self): seed = random.randrange(sys.maxsize) - allsanity_options = self.allsanity_options_without_mods() + allsanity_options = allsanity_options_without_mods() multiworld = setup_solo_multiworld(allsanity_options, seed=seed) ring_items = [item.name for item in multiworld.get_items() if Group.RING in item_table[item.name].groups] self.assertEqual(len(ring_items), len(set(ring_items))) diff --git a/worlds/stardew_valley/test/TestLogic.py b/worlds/stardew_valley/test/TestLogic.py index 494daa9e873..701d9600b3a 100644 --- a/worlds/stardew_valley/test/TestLogic.py +++ b/worlds/stardew_valley/test/TestLogic.py @@ -1,10 +1,10 @@ import unittest -from . import SVTestBase, setup_solo_multiworld +from . import setup_solo_multiworld, allsanity_options_with_mods from ..data.bundle_data import all_bundle_items_except_money from ..stardew_rule import MISSING_ITEM, False_ -multi_world = setup_solo_multiworld(SVTestBase.allsanity_options_without_mods()) +multi_world = setup_solo_multiworld(allsanity_options_with_mods()) world = multi_world.worlds[1] logic = world.logic @@ -38,9 +38,9 @@ def test_given_building_rule_then_can_be_resolved(self): self.assertTrue(rule == False_() or rule(multi_world.state), f"Could not resolve building rule for {building} {rule}") def test_given_quest_rule_then_can_be_resolved(self): - for quest in logic.quest_rules.keys(): + for quest in logic.quest.quest_rules.keys(): with self.subTest(msg=quest): - rule = logic.quest_rules[quest] + rule = logic.quest.quest_rules[quest] self.assertNotIn(MISSING_ITEM, repr(rule)) self.assertTrue(rule == False_() or rule(multi_world.state), f"Could not resolve quest rule for {quest} {rule}") diff --git a/worlds/stardew_valley/test/TestOptions.py b/worlds/stardew_valley/test/TestOptions.py index 00ca84e5cd9..3f8c2195e6e 100644 --- a/worlds/stardew_valley/test/TestOptions.py +++ b/worlds/stardew_valley/test/TestOptions.py @@ -4,7 +4,7 @@ from BaseClasses import ItemClassification, MultiWorld from Options import SpecialRange -from . import setup_solo_multiworld, SVTestBase +from . import setup_solo_multiworld, SVTestBase, allsanity_options_without_mods, allsanity_options_with_mods from .. import StardewItem, items_by_group, Group, StardewValleyWorld from ..locations import locations_by_tag, LocationTags, location_table from ..options import ExcludeGingerIsland, ToolProgression, Goal, SeasonRandomization, TrapItems, SpecialOrderLocations, ArcadeMachineLocations @@ -194,7 +194,7 @@ def test_given_island_related_goal_then_override_exclude_ginger_island(self): class TestTraps(SVTestBase): def test_given_no_traps_when_generate_then_no_trap_in_pool(self): - world_options = self.allsanity_options_without_mods() + world_options = allsanity_options_without_mods() world_options.update({TrapItems.internal_name: TrapItems.option_no_traps}) multi_world = setup_solo_multiworld(world_options) @@ -210,7 +210,7 @@ def test_given_traps_when_generate_then_all_traps_in_pool(self): for value in trap_option.options: if value == "no_traps": continue - world_options = self.allsanity_options_with_mods() + world_options = allsanity_options_with_mods() world_options.update({TrapItems.internal_name: trap_option.options[value]}) multi_world = setup_solo_multiworld(world_options) trap_items = [item_data.name for item_data in items_by_group[Group.TRAP] if Group.DEPRECATED not in item_data.groups and item_data.mod_name is None] diff --git a/worlds/stardew_valley/test/__init__.py b/worlds/stardew_valley/test/__init__.py index fc44d1fa466..10af36ab984 100644 --- a/worlds/stardew_valley/test/__init__.py +++ b/worlds/stardew_valley/test/__init__.py @@ -48,6 +48,86 @@ def get_minsanity_options(): return minsanity +def minimal_locations_maximal_items(): + min_max_options = { + Goal.internal_name: Goal.option_bottom_of_the_mines, + BundleRandomization.internal_name: BundleRandomization.option_vanilla, + BundlePrice.internal_name: BundlePrice.option_very_cheap, + SeasonRandomization.internal_name: SeasonRandomization.option_randomized, + Cropsanity.internal_name: Cropsanity.option_shuffled, + BackpackProgression.internal_name: BackpackProgression.option_vanilla, + ToolProgression.internal_name: ToolProgression.option_vanilla, + SkillProgression.internal_name: SkillProgression.option_vanilla, + BuildingProgression.internal_name: BuildingProgression.option_vanilla, + FestivalLocations.internal_name: FestivalLocations.option_disabled, + ElevatorProgression.internal_name: ElevatorProgression.option_vanilla, + ArcadeMachineLocations.internal_name: ArcadeMachineLocations.option_disabled, + SpecialOrderLocations.internal_name: SpecialOrderLocations.option_disabled, + HelpWantedLocations.internal_name: 0, + Fishsanity.internal_name: Fishsanity.option_none, + Museumsanity.internal_name: Museumsanity.option_none, + Monstersanity.internal_name: Monstersanity.option_none, + Shipsanity.internal_name: Shipsanity.option_none, + Friendsanity.internal_name: Friendsanity.option_none, + FriendsanityHeartSize.internal_name: 8, + NumberOfMovementBuffs.internal_name: 12, + NumberOfLuckBuffs.internal_name: 12, + ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_true, + TrapItems.internal_name: TrapItems.option_nightmare, + Mods.internal_name: (), + } + return min_max_options + + +def allsanity_options_without_mods(): + allsanity = { + Goal.internal_name: Goal.option_perfection, + BundleRandomization.internal_name: BundleRandomization.option_thematic, + BundlePrice.internal_name: BundlePrice.option_expensive, + SeasonRandomization.internal_name: SeasonRandomization.option_randomized, + Cropsanity.internal_name: Cropsanity.option_shuffled, + BackpackProgression.internal_name: BackpackProgression.option_progressive, + ToolProgression.internal_name: ToolProgression.option_progressive, + SkillProgression.internal_name: SkillProgression.option_progressive, + BuildingProgression.internal_name: BuildingProgression.option_progressive, + FestivalLocations.internal_name: FestivalLocations.option_hard, + ElevatorProgression.internal_name: ElevatorProgression.option_progressive, + ArcadeMachineLocations.internal_name: ArcadeMachineLocations.option_full_shuffling, + SpecialOrderLocations.internal_name: SpecialOrderLocations.option_board_qi, + HelpWantedLocations.internal_name: 56, + Fishsanity.internal_name: Fishsanity.option_all, + Museumsanity.internal_name: Museumsanity.option_all, + Monstersanity.internal_name: Monstersanity.option_progressive_goals, + Shipsanity.internal_name: Shipsanity.option_everything, + Cooksanity.internal_name: Cooksanity.option_all, + Chefsanity.internal_name: Chefsanity.option_all, + Craftsanity.internal_name: Craftsanity.option_all, + Friendsanity.internal_name: Friendsanity.option_all_with_marriage, + FriendsanityHeartSize.internal_name: 1, + NumberOfMovementBuffs.internal_name: 12, + NumberOfLuckBuffs.internal_name: 12, + ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_false, + TrapItems.internal_name: TrapItems.option_nightmare, + } + return allsanity + + +def allsanity_options_with_mods(): + allsanity = {} + allsanity.update(allsanity_options_without_mods()) + all_mods = ( + ModNames.deepwoods, ModNames.tractor, ModNames.big_backpack, + ModNames.luck_skill, ModNames.magic, ModNames.socializing_skill, ModNames.archaeology, + ModNames.cooking_skill, ModNames.binning_skill, ModNames.juna, + ModNames.jasper, ModNames.alec, ModNames.yoba, ModNames.eugene, + ModNames.wellwick, ModNames.ginger, ModNames.shiko, ModNames.delores, + ModNames.ayeisha, ModNames.riley, ModNames.skull_cavern_elevator, + ModNames.sve + ) + allsanity.update({Mods.internal_name: all_mods}) + return allsanity + + class SVTestBase(WorldTestBase): game = "Stardew Valley" world: StardewValleyWorld @@ -72,83 +152,6 @@ def run_default_tests(self) -> bool: should_run_default_tests = is_not_stardew_test and super().run_default_tests return should_run_default_tests - @staticmethod - def minimal_locations_maximal_items(): - min_max_options = { - Goal.internal_name: Goal.option_bottom_of_the_mines, - BundleRandomization.internal_name: BundleRandomization.option_vanilla, - BundlePrice.internal_name: BundlePrice.option_very_cheap, - SeasonRandomization.internal_name: SeasonRandomization.option_randomized, - Cropsanity.internal_name: Cropsanity.option_shuffled, - BackpackProgression.internal_name: BackpackProgression.option_vanilla, - ToolProgression.internal_name: ToolProgression.option_vanilla, - SkillProgression.internal_name: SkillProgression.option_vanilla, - BuildingProgression.internal_name: BuildingProgression.option_vanilla, - FestivalLocations.internal_name: FestivalLocations.option_disabled, - ElevatorProgression.internal_name: ElevatorProgression.option_vanilla, - ArcadeMachineLocations.internal_name: ArcadeMachineLocations.option_disabled, - SpecialOrderLocations.internal_name: SpecialOrderLocations.option_disabled, - HelpWantedLocations.internal_name: 0, - Fishsanity.internal_name: Fishsanity.option_none, - Museumsanity.internal_name: Museumsanity.option_none, - Monstersanity.internal_name: Monstersanity.option_none, - Shipsanity.internal_name: Shipsanity.option_none, - Friendsanity.internal_name: Friendsanity.option_none, - FriendsanityHeartSize.internal_name: 8, - NumberOfMovementBuffs.internal_name: 12, - NumberOfLuckBuffs.internal_name: 12, - ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_true, - TrapItems.internal_name: TrapItems.option_nightmare, - Mods.internal_name: (), - } - return min_max_options - - @staticmethod - def allsanity_options_without_mods(): - allsanity = { - Goal.internal_name: Goal.option_perfection, - BundleRandomization.internal_name: BundleRandomization.option_thematic, - BundlePrice.internal_name: BundlePrice.option_expensive, - SeasonRandomization.internal_name: SeasonRandomization.option_randomized, - Cropsanity.internal_name: Cropsanity.option_shuffled, - BackpackProgression.internal_name: BackpackProgression.option_progressive, - ToolProgression.internal_name: ToolProgression.option_progressive, - SkillProgression.internal_name: SkillProgression.option_progressive, - BuildingProgression.internal_name: BuildingProgression.option_progressive, - FestivalLocations.internal_name: FestivalLocations.option_hard, - ElevatorProgression.internal_name: ElevatorProgression.option_progressive, - ArcadeMachineLocations.internal_name: ArcadeMachineLocations.option_full_shuffling, - SpecialOrderLocations.internal_name: SpecialOrderLocations.option_board_qi, - HelpWantedLocations.internal_name: 56, - Fishsanity.internal_name: Fishsanity.option_all, - Museumsanity.internal_name: Museumsanity.option_all, - Monstersanity.internal_name: Monstersanity.option_progressive_goals, - Shipsanity.internal_name: Shipsanity.option_everything, - Cooksanity.internal_name: Cooksanity.option_all, - Chefsanity.internal_name: Chefsanity.option_all, - Craftsanity.internal_name: Craftsanity.option_all, - Friendsanity.internal_name: Friendsanity.option_all_with_marriage, - FriendsanityHeartSize.internal_name: 1, - NumberOfMovementBuffs.internal_name: 12, - NumberOfLuckBuffs.internal_name: 12, - ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_false, - TrapItems.internal_name: TrapItems.option_nightmare, - } - return allsanity - - def allsanity_options_with_mods(self): - allsanity = {} - allsanity.update(self.allsanity_options_without_mods()) - all_mods = ( - ModNames.deepwoods, ModNames.tractor, ModNames.big_backpack, - ModNames.luck_skill, ModNames.magic, ModNames.socializing_skill, ModNames.archaeology, - ModNames.cooking_skill, ModNames.binning_skill, ModNames.juna, - ModNames.jasper, ModNames.alec, ModNames.yoba, ModNames.eugene, - ModNames.wellwick, ModNames.ginger, ModNames.shiko, ModNames.delores, - ModNames.ayeisha, ModNames.riley, ModNames.skull_cavern_elevator - ) - allsanity.update({Mods.internal_name: all_mods}) - return allsanity pre_generated_worlds = {} diff --git a/worlds/stardew_valley/test/mods/TestModFish.py b/worlds/stardew_valley/test/mods/TestModFish.py new file mode 100644 index 00000000000..81ac6ac0fb9 --- /dev/null +++ b/worlds/stardew_valley/test/mods/TestModFish.py @@ -0,0 +1,226 @@ +import unittest +from typing import Set + +from ...data.fish_data import get_fish_for_mods +from ...mods.mod_data import ModNames +from ...strings.fish_names import Fish, SVEFish + +no_mods: Set[str] = set() +sve: Set[str] = {ModNames.sve} + + +class TestGetFishForMods(unittest.TestCase): + + def test_no_mods_all_vanilla_fish(self): + all_fish = get_fish_for_mods(no_mods) + fish_names = {fish.name for fish in all_fish} + + self.assertIn(Fish.albacore, fish_names) + self.assertIn(Fish.anchovy, fish_names) + self.assertIn(Fish.blue_discus, fish_names) + self.assertIn(Fish.bream, fish_names) + self.assertIn(Fish.bullhead, fish_names) + self.assertIn(Fish.carp, fish_names) + self.assertIn(Fish.catfish, fish_names) + self.assertIn(Fish.chub, fish_names) + self.assertIn(Fish.dorado, fish_names) + self.assertIn(Fish.eel, fish_names) + self.assertIn(Fish.flounder, fish_names) + self.assertIn(Fish.ghostfish, fish_names) + self.assertIn(Fish.halibut, fish_names) + self.assertIn(Fish.herring, fish_names) + self.assertIn(Fish.ice_pip, fish_names) + self.assertIn(Fish.largemouth_bass, fish_names) + self.assertIn(Fish.lava_eel, fish_names) + self.assertIn(Fish.lingcod, fish_names) + self.assertIn(Fish.lionfish, fish_names) + self.assertIn(Fish.midnight_carp, fish_names) + self.assertIn(Fish.octopus, fish_names) + self.assertIn(Fish.perch, fish_names) + self.assertIn(Fish.pike, fish_names) + self.assertIn(Fish.pufferfish, fish_names) + self.assertIn(Fish.rainbow_trout, fish_names) + self.assertIn(Fish.red_mullet, fish_names) + self.assertIn(Fish.red_snapper, fish_names) + self.assertIn(Fish.salmon, fish_names) + self.assertIn(Fish.sandfish, fish_names) + self.assertIn(Fish.sardine, fish_names) + self.assertIn(Fish.scorpion_carp, fish_names) + self.assertIn(Fish.sea_cucumber, fish_names) + self.assertIn(Fish.shad, fish_names) + self.assertIn(Fish.slimejack, fish_names) + self.assertIn(Fish.smallmouth_bass, fish_names) + self.assertIn(Fish.squid, fish_names) + self.assertIn(Fish.stingray, fish_names) + self.assertIn(Fish.stonefish, fish_names) + self.assertIn(Fish.sturgeon, fish_names) + self.assertIn(Fish.sunfish, fish_names) + self.assertIn(Fish.super_cucumber, fish_names) + self.assertIn(Fish.tiger_trout, fish_names) + self.assertIn(Fish.tilapia, fish_names) + self.assertIn(Fish.tuna, fish_names) + self.assertIn(Fish.void_salmon, fish_names) + self.assertIn(Fish.walleye, fish_names) + self.assertIn(Fish.woodskip, fish_names) + self.assertIn(Fish.blob_fish, fish_names) + self.assertIn(Fish.midnight_squid, fish_names) + self.assertIn(Fish.spook_fish, fish_names) + self.assertIn(Fish.angler, fish_names) + self.assertIn(Fish.crimsonfish, fish_names) + self.assertIn(Fish.glacierfish, fish_names) + self.assertIn(Fish.legend, fish_names) + self.assertIn(Fish.mutant_carp, fish_names) + self.assertIn(Fish.ms_angler, fish_names) + self.assertIn(Fish.son_of_crimsonfish, fish_names) + self.assertIn(Fish.glacierfish_jr, fish_names) + self.assertIn(Fish.legend_ii, fish_names) + self.assertIn(Fish.radioactive_carp, fish_names) + self.assertIn(Fish.clam, fish_names) + self.assertIn(Fish.cockle, fish_names) + self.assertIn(Fish.crab, fish_names) + self.assertIn(Fish.crayfish, fish_names) + self.assertIn(Fish.lobster, fish_names) + self.assertIn(Fish.mussel, fish_names) + self.assertIn(Fish.oyster, fish_names) + self.assertIn(Fish.periwinkle, fish_names) + self.assertIn(Fish.shrimp, fish_names) + self.assertIn(Fish.snail, fish_names) + + def test_no_mods_no_sve_fish(self): + all_fish = get_fish_for_mods(no_mods) + fish_names = {fish.name for fish in all_fish} + + self.assertNotIn(SVEFish.baby_lunaloo, fish_names) + self.assertNotIn(SVEFish.bonefish, fish_names) + self.assertNotIn(SVEFish.bull_trout, fish_names) + self.assertNotIn(SVEFish.butterfish, fish_names) + self.assertNotIn(SVEFish.clownfish, fish_names) + self.assertNotIn(SVEFish.daggerfish, fish_names) + self.assertNotIn(SVEFish.frog, fish_names) + self.assertNotIn(SVEFish.gemfish, fish_names) + self.assertNotIn(SVEFish.goldenfish, fish_names) + self.assertNotIn(SVEFish.grass_carp, fish_names) + self.assertNotIn(SVEFish.king_salmon, fish_names) + self.assertNotIn(SVEFish.kittyfish, fish_names) + self.assertNotIn(SVEFish.lunaloo, fish_names) + self.assertNotIn(SVEFish.meteor_carp, fish_names) + self.assertNotIn(SVEFish.minnow, fish_names) + self.assertNotIn(SVEFish.puppyfish, fish_names) + self.assertNotIn(SVEFish.radioactive_bass, fish_names) + self.assertNotIn(SVEFish.seahorse, fish_names) + self.assertNotIn(SVEFish.shiny_lunaloo, fish_names) + self.assertNotIn(SVEFish.snatcher_worm, fish_names) + self.assertNotIn(SVEFish.starfish, fish_names) + self.assertNotIn(SVEFish.torpedo_trout, fish_names) + self.assertNotIn(SVEFish.undeadfish, fish_names) + self.assertNotIn(SVEFish.void_eel, fish_names) + self.assertNotIn(SVEFish.water_grub, fish_names) + self.assertNotIn(SVEFish.sea_sponge, fish_names) + self.assertNotIn(SVEFish.dulse_seaweed, fish_names) + + def test_sve_all_vanilla_fish(self): + all_fish = get_fish_for_mods(no_mods) + fish_names = {fish.name for fish in all_fish} + + self.assertIn(Fish.albacore, fish_names) + self.assertIn(Fish.anchovy, fish_names) + self.assertIn(Fish.blue_discus, fish_names) + self.assertIn(Fish.bream, fish_names) + self.assertIn(Fish.bullhead, fish_names) + self.assertIn(Fish.carp, fish_names) + self.assertIn(Fish.catfish, fish_names) + self.assertIn(Fish.chub, fish_names) + self.assertIn(Fish.dorado, fish_names) + self.assertIn(Fish.eel, fish_names) + self.assertIn(Fish.flounder, fish_names) + self.assertIn(Fish.ghostfish, fish_names) + self.assertIn(Fish.halibut, fish_names) + self.assertIn(Fish.herring, fish_names) + self.assertIn(Fish.ice_pip, fish_names) + self.assertIn(Fish.largemouth_bass, fish_names) + self.assertIn(Fish.lava_eel, fish_names) + self.assertIn(Fish.lingcod, fish_names) + self.assertIn(Fish.lionfish, fish_names) + self.assertIn(Fish.midnight_carp, fish_names) + self.assertIn(Fish.octopus, fish_names) + self.assertIn(Fish.perch, fish_names) + self.assertIn(Fish.pike, fish_names) + self.assertIn(Fish.pufferfish, fish_names) + self.assertIn(Fish.rainbow_trout, fish_names) + self.assertIn(Fish.red_mullet, fish_names) + self.assertIn(Fish.red_snapper, fish_names) + self.assertIn(Fish.salmon, fish_names) + self.assertIn(Fish.sandfish, fish_names) + self.assertIn(Fish.sardine, fish_names) + self.assertIn(Fish.scorpion_carp, fish_names) + self.assertIn(Fish.sea_cucumber, fish_names) + self.assertIn(Fish.shad, fish_names) + self.assertIn(Fish.slimejack, fish_names) + self.assertIn(Fish.smallmouth_bass, fish_names) + self.assertIn(Fish.squid, fish_names) + self.assertIn(Fish.stingray, fish_names) + self.assertIn(Fish.stonefish, fish_names) + self.assertIn(Fish.sturgeon, fish_names) + self.assertIn(Fish.sunfish, fish_names) + self.assertIn(Fish.super_cucumber, fish_names) + self.assertIn(Fish.tiger_trout, fish_names) + self.assertIn(Fish.tilapia, fish_names) + self.assertIn(Fish.tuna, fish_names) + self.assertIn(Fish.void_salmon, fish_names) + self.assertIn(Fish.walleye, fish_names) + self.assertIn(Fish.woodskip, fish_names) + self.assertIn(Fish.blob_fish, fish_names) + self.assertIn(Fish.midnight_squid, fish_names) + self.assertIn(Fish.spook_fish, fish_names) + self.assertIn(Fish.angler, fish_names) + self.assertIn(Fish.crimsonfish, fish_names) + self.assertIn(Fish.glacierfish, fish_names) + self.assertIn(Fish.legend, fish_names) + self.assertIn(Fish.mutant_carp, fish_names) + self.assertIn(Fish.ms_angler, fish_names) + self.assertIn(Fish.son_of_crimsonfish, fish_names) + self.assertIn(Fish.glacierfish_jr, fish_names) + self.assertIn(Fish.legend_ii, fish_names) + self.assertIn(Fish.radioactive_carp, fish_names) + self.assertIn(Fish.clam, fish_names) + self.assertIn(Fish.cockle, fish_names) + self.assertIn(Fish.crab, fish_names) + self.assertIn(Fish.crayfish, fish_names) + self.assertIn(Fish.lobster, fish_names) + self.assertIn(Fish.mussel, fish_names) + self.assertIn(Fish.oyster, fish_names) + self.assertIn(Fish.periwinkle, fish_names) + self.assertIn(Fish.shrimp, fish_names) + self.assertIn(Fish.snail, fish_names) + + def test_sve_has_sve_fish(self): + all_fish = get_fish_for_mods(sve) + fish_names = {fish.name for fish in all_fish} + + self.assertIn(SVEFish.baby_lunaloo, fish_names) + self.assertIn(SVEFish.bonefish, fish_names) + self.assertIn(SVEFish.bull_trout, fish_names) + self.assertIn(SVEFish.butterfish, fish_names) + self.assertIn(SVEFish.clownfish, fish_names) + self.assertIn(SVEFish.daggerfish, fish_names) + self.assertIn(SVEFish.frog, fish_names) + self.assertIn(SVEFish.gemfish, fish_names) + self.assertIn(SVEFish.goldenfish, fish_names) + self.assertIn(SVEFish.grass_carp, fish_names) + self.assertIn(SVEFish.king_salmon, fish_names) + self.assertIn(SVEFish.kittyfish, fish_names) + self.assertIn(SVEFish.lunaloo, fish_names) + self.assertIn(SVEFish.meteor_carp, fish_names) + self.assertIn(SVEFish.minnow, fish_names) + self.assertIn(SVEFish.puppyfish, fish_names) + self.assertIn(SVEFish.radioactive_bass, fish_names) + self.assertIn(SVEFish.seahorse, fish_names) + self.assertIn(SVEFish.shiny_lunaloo, fish_names) + self.assertIn(SVEFish.snatcher_worm, fish_names) + self.assertIn(SVEFish.starfish, fish_names) + self.assertIn(SVEFish.torpedo_trout, fish_names) + self.assertIn(SVEFish.undeadfish, fish_names) + self.assertIn(SVEFish.void_eel, fish_names) + self.assertIn(SVEFish.water_grub, fish_names) + self.assertIn(SVEFish.sea_sponge, fish_names) + self.assertIn(SVEFish.dulse_seaweed, fish_names) diff --git a/worlds/stardew_valley/test/mods/TestModVillagers.py b/worlds/stardew_valley/test/mods/TestModVillagers.py new file mode 100644 index 00000000000..85fe6d5ce3a --- /dev/null +++ b/worlds/stardew_valley/test/mods/TestModVillagers.py @@ -0,0 +1,128 @@ +import unittest +from typing import Set + +from ...data.villagers_data import get_villagers_for_mods +from ...mods.mod_data import ModNames +from ...strings.villager_names import NPC, ModNPC + +no_mods: Set[str] = set() +sve: Set[str] = {ModNames.sve} + + +class TestGetVillagersForMods(unittest.TestCase): + + def test_no_mods_all_vanilla_villagers(self): + villagers = get_villagers_for_mods(no_mods) + villager_names = {villager.name for villager in villagers} + + self.assertIn(NPC.alex, villager_names) + self.assertIn(NPC.elliott, villager_names) + self.assertIn(NPC.harvey, villager_names) + self.assertIn(NPC.sam, villager_names) + self.assertIn(NPC.sebastian, villager_names) + self.assertIn(NPC.shane, villager_names) + self.assertIn(NPC.abigail, villager_names) + self.assertIn(NPC.emily, villager_names) + self.assertIn(NPC.haley, villager_names) + self.assertIn(NPC.leah, villager_names) + self.assertIn(NPC.maru, villager_names) + self.assertIn(NPC.penny, villager_names) + self.assertIn(NPC.caroline, villager_names) + self.assertIn(NPC.clint, villager_names) + self.assertIn(NPC.demetrius, villager_names) + self.assertIn(NPC.dwarf, villager_names) + self.assertIn(NPC.evelyn, villager_names) + self.assertIn(NPC.george, villager_names) + self.assertIn(NPC.gus, villager_names) + self.assertIn(NPC.jas, villager_names) + self.assertIn(NPC.jodi, villager_names) + self.assertIn(NPC.kent, villager_names) + self.assertIn(NPC.krobus, villager_names) + self.assertIn(NPC.leo, villager_names) + self.assertIn(NPC.lewis, villager_names) + self.assertIn(NPC.linus, villager_names) + self.assertIn(NPC.marnie, villager_names) + self.assertIn(NPC.pam, villager_names) + self.assertIn(NPC.pierre, villager_names) + self.assertIn(NPC.robin, villager_names) + self.assertIn(NPC.sandy, villager_names) + self.assertIn(NPC.vincent, villager_names) + self.assertIn(NPC.willy, villager_names) + self.assertIn(NPC.wizard, villager_names) + + def test_no_mods_no_mod_villagers(self): + villagers = get_villagers_for_mods(no_mods) + villager_names = {villager.name for villager in villagers} + + self.assertNotIn(ModNPC.alec, villager_names) + self.assertNotIn(ModNPC.ayeisha, villager_names) + self.assertNotIn(ModNPC.delores, villager_names) + self.assertNotIn(ModNPC.eugene, villager_names) + self.assertNotIn(ModNPC.jasper, villager_names) + self.assertNotIn(ModNPC.juna, villager_names) + self.assertNotIn(ModNPC.mr_ginger, villager_names) + self.assertNotIn(ModNPC.riley, villager_names) + self.assertNotIn(ModNPC.shiko, villager_names) + self.assertNotIn(ModNPC.wellwick, villager_names) + self.assertNotIn(ModNPC.yoba, villager_names) + self.assertNotIn(ModNPC.lance, villager_names) + self.assertNotIn(ModNPC.apples, villager_names) + self.assertNotIn(ModNPC.claire, villager_names) + self.assertNotIn(ModNPC.olivia, villager_names) + self.assertNotIn(ModNPC.sophia, villager_names) + self.assertNotIn(ModNPC.victor, villager_names) + self.assertNotIn(ModNPC.andy, villager_names) + self.assertNotIn(ModNPC.gunther, villager_names) + self.assertNotIn(ModNPC.martin, villager_names) + self.assertNotIn(ModNPC.marlon, villager_names) + self.assertNotIn(ModNPC.morgan, villager_names) + self.assertNotIn(ModNPC.morris, villager_names) + self.assertNotIn(ModNPC.scarlett, villager_names) + self.assertNotIn(ModNPC.susan, villager_names) + + def test_sve_has_sve_villagers(self): + villagers = get_villagers_for_mods(sve) + villager_names = {villager.name for villager in villagers} + + self.assertIn(ModNPC.lance, villager_names) + self.assertIn(ModNPC.apples, villager_names) + self.assertIn(ModNPC.claire, villager_names) + self.assertIn(ModNPC.olivia, villager_names) + self.assertIn(ModNPC.sophia, villager_names) + self.assertIn(ModNPC.victor, villager_names) + self.assertIn(ModNPC.andy, villager_names) + self.assertIn(ModNPC.gunther, villager_names) + self.assertIn(ModNPC.martin, villager_names) + self.assertIn(ModNPC.marlon, villager_names) + self.assertIn(ModNPC.morgan, villager_names) + self.assertIn(ModNPC.morris, villager_names) + self.assertIn(ModNPC.scarlett, villager_names) + self.assertIn(ModNPC.susan, villager_names) + + def test_sve_has_no_other_mod_villagers(self): + villagers = get_villagers_for_mods(sve) + villager_names = {villager.name for villager in villagers} + + self.assertNotIn(ModNPC.alec, villager_names) + self.assertNotIn(ModNPC.ayeisha, villager_names) + self.assertNotIn(ModNPC.delores, villager_names) + self.assertNotIn(ModNPC.eugene, villager_names) + self.assertNotIn(ModNPC.jasper, villager_names) + self.assertNotIn(ModNPC.juna, villager_names) + self.assertNotIn(ModNPC.mr_ginger, villager_names) + self.assertNotIn(ModNPC.riley, villager_names) + self.assertNotIn(ModNPC.shiko, villager_names) + self.assertNotIn(ModNPC.wellwick, villager_names) + self.assertNotIn(ModNPC.yoba, villager_names) + + def test_no_mods_wizard_is_not_bachelor(self): + villagers = get_villagers_for_mods(no_mods) + villagers_by_name = {villager.name: villager for villager in villagers} + self.assertFalse(villagers_by_name[NPC.wizard].bachelor) + self.assertEqual(villagers_by_name[NPC.wizard].mod_name, ModNames.vanilla) + + def test_sve_wizard_is_bachelor(self): + villagers = get_villagers_for_mods(sve) + villagers_by_name = {villager.name: villager for villager in villagers} + self.assertTrue(villagers_by_name[NPC.wizard].bachelor) + self.assertEqual(villagers_by_name[NPC.wizard].mod_name, ModNames.sve) diff --git a/worlds/stardew_valley/test/mods/TestMods.py b/worlds/stardew_valley/test/mods/TestMods.py index 049b8e96566..4149cff66aa 100644 --- a/worlds/stardew_valley/test/mods/TestMods.py +++ b/worlds/stardew_valley/test/mods/TestMods.py @@ -5,7 +5,7 @@ from BaseClasses import MultiWorld from ...mods.mod_data import ModNames -from .. import setup_solo_multiworld +from .. import setup_solo_multiworld, allsanity_options_without_mods from ..TestOptions import basic_checks, SVTestBase from ... import items, Group, ItemClassification from ...regions import RandomizationFlag, create_final_connections, randomize_connections, create_final_regions @@ -19,7 +19,7 @@ ModNames.cooking_skill, ModNames.binning_skill, ModNames.juna, ModNames.jasper, ModNames.alec, ModNames.yoba, ModNames.eugene, ModNames.wellwick, ModNames.ginger, ModNames.shiko, ModNames.delores, - ModNames.ayeisha, ModNames.riley, ModNames.skull_cavern_elevator}) + ModNames.ayeisha, ModNames.riley, ModNames.skull_cavern_elevator, ModNames.sve}) def check_stray_mod_items(chosen_mods: Union[List[str], str], tester: SVTestBase, multiworld: MultiWorld): @@ -147,7 +147,7 @@ def test_given_traps_when_generate_then_all_traps_in_pool(self): for value in TrapItems.options: if value == "no_traps": continue - world_options = self.allsanity_options_without_mods() + world_options = allsanity_options_without_mods() world_options.update({TrapItems.internal_name: TrapItems.options[value], Mods: "Magic"}) multi_world = setup_solo_multiworld(world_options) trap_items = [item_data.name for item_data in items_by_group[Group.TRAP] if Group.DEPRECATED not in item_data.groups]