Stardew Valley 6.x.x: The Content Update (#3478)

Focus of the Update: Compatibility with Stardew Valley 1.6 Released on March 19th 2024
This includes randomization for pretty much all of the new content, including but not limited to
- Raccoon Bundles
- Booksanity
- Skill Masteries
- New Recipes, Craftables, Fish, Maps, Farm Type, Festivals and Quests

This also includes a significant reorganisation of the code into "Content Packs", to allow for easier modularity of various game mechanics between the settings and the supported mods. This improves maintainability quite a bit.

In addition to that, a few **very** requested new features have been introduced, although they weren't the focus of this update
- Walnutsanity
- Player Buffs
- More customizability in settings, such as shorter special orders, ER without farmhouse
- New Remixed Bundles
This commit is contained in:
agilbert1412
2024-07-07 16:04:25 +03:00
committed by GitHub
parent f99ee77325
commit 9b22458f44
210 changed files with 10298 additions and 4540 deletions

View File

@@ -0,0 +1,54 @@
from . import SVContentPackTestBase
from ...data.artisan import MachineSource
from ...strings.artisan_good_names import ArtisanGood
from ...strings.crop_names import Vegetable, Fruit
from ...strings.food_names import Beverage
from ...strings.forageable_names import Forageable
from ...strings.machine_names import Machine
from ...strings.seed_names import Seed
wine_base_fruits = [
Fruit.ancient_fruit, Fruit.apple, Fruit.apricot, Forageable.blackberry, Fruit.blueberry, Forageable.cactus_fruit, Fruit.cherry,
Forageable.coconut, Fruit.cranberries, Forageable.crystal_fruit, Fruit.grape, Fruit.hot_pepper, Fruit.melon, Fruit.orange, Fruit.peach,
Fruit.pomegranate, Fruit.powdermelon, Fruit.rhubarb, Forageable.salmonberry, Forageable.spice_berry, Fruit.starfruit, Fruit.strawberry
]
juice_base_vegetables = (
Vegetable.amaranth, Vegetable.artichoke, Vegetable.beet, Vegetable.bok_choy, Vegetable.broccoli, Vegetable.carrot, Vegetable.cauliflower,
Vegetable.corn, Vegetable.eggplant, Forageable.fiddlehead_fern, Vegetable.garlic, Vegetable.green_bean, Vegetable.kale, Vegetable.parsnip, Vegetable.potato,
Vegetable.pumpkin, Vegetable.radish, Vegetable.red_cabbage, Vegetable.summer_squash, Vegetable.tomato, Vegetable.unmilled_rice, Vegetable.yam
)
non_juice_base_vegetables = (
Vegetable.hops, Vegetable.tea_leaves, Vegetable.wheat
)
class TestArtisanEquipment(SVContentPackTestBase):
def test_keg_special_recipes(self):
self.assertIn(MachineSource(item=Vegetable.wheat, machine=Machine.keg), self.content.game_items[Beverage.beer].sources)
# self.assertIn(MachineSource(item=Ingredient.rice, machine=Machine.keg), self.content.game_items[Ingredient.vinegar].sources)
self.assertIn(MachineSource(item=Seed.coffee, machine=Machine.keg), self.content.game_items[Beverage.coffee].sources)
self.assertIn(MachineSource(item=Vegetable.tea_leaves, machine=Machine.keg), self.content.game_items[ArtisanGood.green_tea].sources)
self.assertIn(MachineSource(item=ArtisanGood.honey, machine=Machine.keg), self.content.game_items[ArtisanGood.mead].sources)
self.assertIn(MachineSource(item=Vegetable.hops, machine=Machine.keg), self.content.game_items[ArtisanGood.pale_ale].sources)
def test_fruits_can_be_made_into_wines(self):
for fruit in wine_base_fruits:
with self.subTest(fruit):
self.assertIn(MachineSource(item=fruit, machine=Machine.keg), self.content.game_items[ArtisanGood.specific_wine(fruit)].sources)
self.assertIn(MachineSource(item=fruit, machine=Machine.keg), self.content.game_items[ArtisanGood.wine].sources)
def test_vegetables_can_be_made_into_juices(self):
for vegetable in juice_base_vegetables:
with self.subTest(vegetable):
self.assertIn(MachineSource(item=vegetable, machine=Machine.keg), self.content.game_items[ArtisanGood.specific_juice(vegetable)].sources)
self.assertIn(MachineSource(item=vegetable, machine=Machine.keg), self.content.game_items[ArtisanGood.juice].sources)
def test_non_juice_vegetables_cannot_be_made_into_juices(self):
for vegetable in non_juice_base_vegetables:
with self.subTest(vegetable):
self.assertNotIn(ArtisanGood.specific_juice(vegetable), self.content.game_items)
self.assertNotIn(MachineSource(item=vegetable, machine=Machine.keg), self.content.game_items[ArtisanGood.juice].sources)

View File

@@ -0,0 +1,55 @@
from . import SVContentPackTestBase
from .. import SVTestBase
from ... import options
from ...content import content_packs
from ...data.artisan import MachineSource
from ...strings.artisan_good_names import ArtisanGood
from ...strings.crop_names import Fruit, Vegetable
from ...strings.fish_names import Fish
from ...strings.machine_names import Machine
from ...strings.villager_names import NPC
class TestGingerIsland(SVContentPackTestBase):
vanilla_packs = SVContentPackTestBase.vanilla_packs + (content_packs.ginger_island_content_pack,)
def test_leo_is_included(self):
self.assertIn(NPC.leo, self.content.villagers)
def test_ginger_island_fishes_are_included(self):
fish_names = self.content.fishes.keys()
self.assertIn(Fish.blue_discus, fish_names)
self.assertIn(Fish.lionfish, fish_names)
self.assertIn(Fish.stingray, fish_names)
# 63 from pelican town + 3 ginger island exclusive
self.assertEqual(63 + 3, len(self.content.fishes))
def test_ginger_island_fruits_can_be_made_into_wines(self):
self.assertIn(MachineSource(item=Fruit.banana, machine=Machine.keg), self.content.game_items[ArtisanGood.specific_wine(Fruit.banana)].sources)
self.assertIn(MachineSource(item=Fruit.banana, machine=Machine.keg), self.content.game_items[ArtisanGood.wine].sources)
self.assertIn(MachineSource(item=Fruit.mango, machine=Machine.keg), self.content.game_items[ArtisanGood.specific_wine(Fruit.mango)].sources)
self.assertIn(MachineSource(item=Fruit.mango, machine=Machine.keg), self.content.game_items[ArtisanGood.wine].sources)
self.assertIn(MachineSource(item=Fruit.pineapple, machine=Machine.keg), self.content.game_items[ArtisanGood.specific_wine(Fruit.pineapple)].sources)
self.assertIn(MachineSource(item=Fruit.pineapple, machine=Machine.keg), self.content.game_items[ArtisanGood.wine].sources)
def test_ginger_island_vegetables_can_be_made_into_wines(self):
taro_root_juice_sources = self.content.game_items[ArtisanGood.specific_juice(Vegetable.taro_root)].sources
self.assertIn(MachineSource(item=Vegetable.taro_root, machine=Machine.keg), taro_root_juice_sources)
self.assertIn(MachineSource(item=Vegetable.taro_root, machine=Machine.keg), self.content.game_items[ArtisanGood.juice].sources)
class TestWithoutGingerIslandE2E(SVTestBase):
options = {
options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_true
}
def test_leo_is_not_in_the_pool(self):
for item in self.multiworld.itempool:
self.assertFalse(("Friendsanity: " + NPC.leo) in item.name)
for location in self.multiworld.get_locations(self.player):
self.assertFalse(("Friendsanity: " + NPC.leo) in location.name)

View File

@@ -0,0 +1,112 @@
from . import SVContentPackTestBase
from ...strings.fish_names import Fish
from ...strings.villager_names import NPC
class TestPelicanTown(SVContentPackTestBase):
def test_all_pelican_town_villagers_are_included(self):
self.assertIn(NPC.alex, self.content.villagers)
self.assertIn(NPC.elliott, self.content.villagers)
self.assertIn(NPC.harvey, self.content.villagers)
self.assertIn(NPC.sam, self.content.villagers)
self.assertIn(NPC.sebastian, self.content.villagers)
self.assertIn(NPC.shane, self.content.villagers)
self.assertIn(NPC.abigail, self.content.villagers)
self.assertIn(NPC.emily, self.content.villagers)
self.assertIn(NPC.haley, self.content.villagers)
self.assertIn(NPC.leah, self.content.villagers)
self.assertIn(NPC.maru, self.content.villagers)
self.assertIn(NPC.penny, self.content.villagers)
self.assertIn(NPC.caroline, self.content.villagers)
self.assertIn(NPC.clint, self.content.villagers)
self.assertIn(NPC.demetrius, self.content.villagers)
self.assertIn(NPC.dwarf, self.content.villagers)
self.assertIn(NPC.evelyn, self.content.villagers)
self.assertIn(NPC.george, self.content.villagers)
self.assertIn(NPC.gus, self.content.villagers)
self.assertIn(NPC.jas, self.content.villagers)
self.assertIn(NPC.jodi, self.content.villagers)
self.assertIn(NPC.kent, self.content.villagers)
self.assertIn(NPC.krobus, self.content.villagers)
self.assertIn(NPC.lewis, self.content.villagers)
self.assertIn(NPC.linus, self.content.villagers)
self.assertIn(NPC.marnie, self.content.villagers)
self.assertIn(NPC.pam, self.content.villagers)
self.assertIn(NPC.pierre, self.content.villagers)
self.assertIn(NPC.robin, self.content.villagers)
self.assertIn(NPC.sandy, self.content.villagers)
self.assertIn(NPC.vincent, self.content.villagers)
self.assertIn(NPC.willy, self.content.villagers)
self.assertIn(NPC.wizard, self.content.villagers)
self.assertEqual(33, len(self.content.villagers))
def test_all_pelican_town_fishes_are_included(self):
fish_names = self.content.fishes.keys()
self.assertIn(Fish.albacore, fish_names)
self.assertIn(Fish.anchovy, 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.goby, 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.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.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.blobfish, 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.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)
self.assertEqual(63, len(self.content.fishes))

View File

@@ -0,0 +1,27 @@
from . import SVContentPackTestBase
from ...content import content_packs
from ...data.artisan import MachineSource
from ...strings.artisan_good_names import ArtisanGood
from ...strings.crop_names import Fruit
from ...strings.fish_names import Fish
from ...strings.machine_names import Machine
class TestQiBoard(SVContentPackTestBase):
vanilla_packs = SVContentPackTestBase.vanilla_packs + (content_packs.ginger_island_content_pack, content_packs.qi_board_content_pack)
def test_extended_family_fishes_are_included(self):
fish_names = self.content.fishes.keys()
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)
# 63 from pelican town + 3 ginger island exclusive + 5 extended family
self.assertEqual(63 + 3 + 5, len(self.content.fishes))
def test_wines(self):
self.assertIn(MachineSource(item=Fruit.qi_fruit, machine=Machine.keg), self.content.game_items[ArtisanGood.specific_wine(Fruit.qi_fruit)].sources)
self.assertIn(MachineSource(item=Fruit.qi_fruit, machine=Machine.keg), self.content.game_items[ArtisanGood.wine].sources)

View File

@@ -0,0 +1,23 @@
import unittest
from typing import ClassVar, Tuple
from ...content import content_packs, ContentPack, StardewContent, unpack_content, StardewFeatures, feature
default_features = StardewFeatures(
feature.booksanity.BooksanityDisabled(),
feature.cropsanity.CropsanityDisabled(),
feature.fishsanity.FishsanityNone(),
feature.friendsanity.FriendsanityNone()
)
class SVContentPackTestBase(unittest.TestCase):
vanilla_packs: ClassVar[Tuple[ContentPack]] = (content_packs.pelican_town, content_packs.the_desert, content_packs.the_farm, content_packs.the_mines)
mods: ClassVar[Tuple[str]] = ()
content: ClassVar[StardewContent]
@classmethod
def setUpClass(cls) -> None:
packs = cls.vanilla_packs + tuple(content_packs.by_mod[mod] for mod in cls.mods)
cls.content = unpack_content(default_features, packs)

View File

@@ -0,0 +1,33 @@
import unittest
from ....content.feature import friendsanity
class TestHeartSteps(unittest.TestCase):
def test_given_size_of_one_when_calculate_steps_then_advance_one_heart_at_the_time(self):
steps = friendsanity.get_heart_steps(4, 1)
self.assertEqual(steps, (1, 2, 3, 4))
def test_given_size_of_two_when_calculate_steps_then_advance_two_heart_at_the_time(self):
steps = friendsanity.get_heart_steps(6, 2)
self.assertEqual(steps, (2, 4, 6))
def test_given_size_of_three_and_max_heart_not_multiple_of_three_when_calculate_steps_then_add_max_as_last_step(self):
steps = friendsanity.get_heart_steps(7, 3)
self.assertEqual(steps, (3, 6, 7))
class TestExtractNpcFromLocation(unittest.TestCase):
def test_given_npc_with_space_in_name_when_extract_then_find_name_and_heart(self):
npc = "Mr. Ginger"
location_name = friendsanity.to_location_name(npc, 34)
found_name, found_heart = friendsanity.extract_npc_from_location_name(location_name)
self.assertEqual(found_name, npc)
self.assertEqual(found_heart, 34)

View File

@@ -0,0 +1,14 @@
from ....data.artisan import MachineSource
from ....mods.mod_data import ModNames
from ....strings.artisan_good_names import ArtisanGood
from ....strings.crop_names import Fruit
from ....strings.machine_names import Machine
from ....test.content import SVContentPackTestBase
class TestArtisanEquipment(SVContentPackTestBase):
mods = (ModNames.deepwoods,)
def test_mango_wine_exists(self):
self.assertIn(MachineSource(item=Fruit.mango, machine=Machine.keg), self.content.game_items[ArtisanGood.specific_wine(Fruit.mango)].sources)
self.assertIn(MachineSource(item=Fruit.mango, machine=Machine.keg), self.content.game_items[ArtisanGood.wine].sources)

View File

@@ -0,0 +1,27 @@
from .. import SVContentPackTestBase
from ....mods.mod_data import ModNames
from ....strings.villager_names import ModNPC
class TestJasperWithoutSVE(SVContentPackTestBase):
mods = (ModNames.jasper,)
def test_gunther_is_added(self):
self.assertIn(ModNPC.gunther, self.content.villagers)
self.assertEqual(self.content.villagers[ModNPC.gunther].mod_name, ModNames.jasper)
def test_marlon_is_added(self):
self.assertIn(ModNPC.marlon, self.content.villagers)
self.assertEqual(self.content.villagers[ModNPC.marlon].mod_name, ModNames.jasper)
class TestJasperWithSVE(SVContentPackTestBase):
mods = (ModNames.jasper, ModNames.sve)
def test_gunther_is_added(self):
self.assertIn(ModNPC.gunther, self.content.villagers)
self.assertEqual(self.content.villagers[ModNPC.gunther].mod_name, ModNames.sve)
def test_marlon_is_added(self):
self.assertIn(ModNPC.marlon, self.content.villagers)
self.assertEqual(self.content.villagers[ModNPC.marlon].mod_name, ModNames.sve)

View File

@@ -0,0 +1,143 @@
from .. import SVContentPackTestBase
from ... import SVTestBase
from .... import options
from ....content import content_packs
from ....mods.mod_data import ModNames
from ....strings.fish_names import SVEFish
from ....strings.villager_names import ModNPC, NPC
vanilla_villagers = 33
vanilla_villagers_with_leo = 34
sve_villagers = 13
sve_villagers_with_lance = 14
vanilla_pelican_town_fish = 63
vanilla_ginger_island_fish = 3
sve_pelican_town_fish = 16
sve_ginger_island_fish = 10
class TestVanilla(SVContentPackTestBase):
def test_wizard_is_not_bachelor(self):
self.assertFalse(self.content.villagers[NPC.wizard].bachelor)
class TestSVE(SVContentPackTestBase):
mods = (ModNames.sve,)
def test_lance_is_not_included(self):
self.assertNotIn(ModNPC.lance, self.content.villagers)
def test_wizard_is_bachelor(self):
self.assertTrue(self.content.villagers[NPC.wizard].bachelor)
self.assertEqual(self.content.villagers[NPC.wizard].mod_name, ModNames.sve)
def test_sve_npc_are_included(self):
self.assertIn(ModNPC.apples, self.content.villagers)
self.assertIn(ModNPC.claire, self.content.villagers)
self.assertIn(ModNPC.olivia, self.content.villagers)
self.assertIn(ModNPC.sophia, self.content.villagers)
self.assertIn(ModNPC.victor, self.content.villagers)
self.assertIn(ModNPC.andy, self.content.villagers)
self.assertIn(ModNPC.gunther, self.content.villagers)
self.assertIn(ModNPC.martin, self.content.villagers)
self.assertIn(ModNPC.marlon, self.content.villagers)
self.assertIn(ModNPC.morgan, self.content.villagers)
self.assertIn(ModNPC.morris, self.content.villagers)
self.assertIn(ModNPC.scarlett, self.content.villagers)
self.assertIn(ModNPC.susan, self.content.villagers)
self.assertEqual(vanilla_villagers + sve_villagers, len(self.content.villagers))
def test_sve_has_sve_fish(self):
fish_names = self.content.fishes.keys()
self.assertIn(SVEFish.bonefish, fish_names)
self.assertIn(SVEFish.bull_trout, fish_names)
self.assertIn(SVEFish.butterfish, fish_names)
self.assertIn(SVEFish.frog, 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.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.snatcher_worm, fish_names)
self.assertIn(SVEFish.undeadfish, fish_names)
self.assertIn(SVEFish.void_eel, fish_names)
self.assertIn(SVEFish.water_grub, fish_names)
self.assertEqual(vanilla_pelican_town_fish + sve_pelican_town_fish, len(self.content.fishes))
class TestSVEWithGingerIsland(SVContentPackTestBase):
vanilla_packs = SVContentPackTestBase.vanilla_packs + (content_packs.ginger_island_content_pack,)
mods = (ModNames.sve,)
def test_lance_is_included(self):
self.assertIn(ModNPC.lance, self.content.villagers)
def test_other_sve_npc_are_included(self):
self.assertIn(ModNPC.apples, self.content.villagers)
self.assertIn(ModNPC.claire, self.content.villagers)
self.assertIn(ModNPC.olivia, self.content.villagers)
self.assertIn(ModNPC.sophia, self.content.villagers)
self.assertIn(ModNPC.victor, self.content.villagers)
self.assertIn(ModNPC.andy, self.content.villagers)
self.assertIn(ModNPC.gunther, self.content.villagers)
self.assertIn(ModNPC.martin, self.content.villagers)
self.assertIn(ModNPC.marlon, self.content.villagers)
self.assertIn(ModNPC.morgan, self.content.villagers)
self.assertIn(ModNPC.morris, self.content.villagers)
self.assertIn(ModNPC.scarlett, self.content.villagers)
self.assertIn(ModNPC.susan, self.content.villagers)
self.assertEqual(vanilla_villagers_with_leo + sve_villagers_with_lance, len(self.content.villagers))
def test_sve_has_sve_fish(self):
fish_names = self.content.fishes.keys()
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.assertEqual(vanilla_pelican_town_fish + vanilla_ginger_island_fish + sve_pelican_town_fish + sve_ginger_island_fish, len(self.content.fishes))
class TestSVEWithoutGingerIslandE2E(SVTestBase):
options = {
options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_true,
options.Mods: ModNames.sve
}
def test_lance_is_not_in_the_pool(self):
for item in self.multiworld.itempool:
self.assertFalse(("Friendsanity: " + ModNPC.lance) in item.name)
for location in self.multiworld.get_locations(self.player):
self.assertFalse(("Friendsanity: " + ModNPC.lance) in location.name)