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:
54
worlds/stardew_valley/test/content/TestArtisanEquipment.py
Normal file
54
worlds/stardew_valley/test/content/TestArtisanEquipment.py
Normal 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)
|
||||
55
worlds/stardew_valley/test/content/TestGingerIsland.py
Normal file
55
worlds/stardew_valley/test/content/TestGingerIsland.py
Normal 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)
|
||||
112
worlds/stardew_valley/test/content/TestPelicanTown.py
Normal file
112
worlds/stardew_valley/test/content/TestPelicanTown.py
Normal 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))
|
||||
27
worlds/stardew_valley/test/content/TestQiBoard.py
Normal file
27
worlds/stardew_valley/test/content/TestQiBoard.py
Normal 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)
|
||||
23
worlds/stardew_valley/test/content/__init__.py
Normal file
23
worlds/stardew_valley/test/content/__init__.py
Normal 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)
|
||||
@@ -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)
|
||||
14
worlds/stardew_valley/test/content/mods/TestDeepwoods.py
Normal file
14
worlds/stardew_valley/test/content/mods/TestDeepwoods.py
Normal 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)
|
||||
27
worlds/stardew_valley/test/content/mods/TestJasper.py
Normal file
27
worlds/stardew_valley/test/content/mods/TestJasper.py
Normal 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)
|
||||
143
worlds/stardew_valley/test/content/mods/TestSVE.py
Normal file
143
worlds/stardew_valley/test/content/mods/TestSVE.py
Normal 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)
|
||||
0
worlds/stardew_valley/test/content/mods/__init__.py
Normal file
0
worlds/stardew_valley/test/content/mods/__init__.py
Normal file
Reference in New Issue
Block a user