Stardew Valley: 4.x.x - The Ginger Update (#1931)

## What is this fixing or adding?
Major content update for Stardew Valley

## How was this tested?
One large-scale public Beta on the archipelago server, plus several smaller private asyncs and test runs

You can go to https://github.com/agilbert1412/StardewArchipelago/releases to grab the mod (latest 4.x.x version), the supported mods and the apworld, to test this PR

## New Features:
- Festival Checks [Easy mode or Hard Mode]
- Special Orders [Both Board and Qi]
- Willy's Boat
- Ginger Island Parrots
- TV Channels
- Trap Items [Available in various difficulty levels]
- Entrance Randomizer: Buildings and Chaos
- New Fishsanity options: Exclude Legendaries, Exclude Hard fish, Only easy fish
- Resource Pack overhaul [Resource packs are now more enjoyable and varied]
- Goal: Greatest Walnut Hunter [Find every single Golden Walnut]
- Goal: Perfection [Achieve Perfection]
- Option: Profit Margin [Multiplier over all earnings]
- Option: Friendsanity Heart Size [Reduce clutter from friendsanity hearts]
- Option: Exclude Ginger Island - will exclude many locations and items to generate a playthrough that does not go to the island
- Mod Support [Curated list of mods]

## New Contributors:
@Witchybun for the mod support

---------

Co-authored-by: Witchybun <embenham05@gmail.com>
Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
Co-authored-by: Fabian Dill <Berserker66@users.noreply.github.com>
This commit is contained in:
agilbert1412
2023-07-19 14:26:38 -04:00
committed by GitHub
parent 1f6db12797
commit 62657df3fb
94 changed files with 8320 additions and 3104 deletions

View File

@@ -1,9 +1,9 @@
from dataclasses import dataclass
from typing import List, Tuple, Union
from typing import List, Tuple, Union, Optional
from . import season_data as season
from .game_item import GameItem
from .region_data import SVRegion
from ..strings.region_names import Region
@dataclass(frozen=True)
@@ -11,41 +11,43 @@ class FishItem(GameItem):
locations: Tuple[str]
seasons: Tuple[str]
difficulty: int
mod_name: Optional[str]
def __repr__(self):
return f"{self.name} [{self.item_id}] (Locations: {self.locations} |" \
f" Seasons: {self.seasons} |" \
f" Difficulty: {self.difficulty}) "
f" Difficulty: {self.difficulty}) |" \
f"Mod: {self.mod_name}"
fresh_water = (SVRegion.farm, SVRegion.forest, SVRegion.town, SVRegion.mountain)
ocean = (SVRegion.beach,)
town_river = (SVRegion.town,)
mountain_lake = (SVRegion.mountain,)
forest_pond = (SVRegion.forest,)
forest_river = (SVRegion.forest,)
secret_woods = (SVRegion.secret_woods,)
mines_floor_20 = (SVRegion.mines_floor_20,)
mines_floor_60 = (SVRegion.mines_floor_60,)
mines_floor_100 = (SVRegion.mines_floor_100,)
sewers = (SVRegion.sewers,)
desert = (SVRegion.desert,)
mutant_bug_lair = (SVRegion.mutant_bug_lair,)
witch_swamp = (SVRegion.witch_swamp,)
night_market = (SVRegion.beach,)
ginger_island_ocean = (SVRegion.ginger_island,)
ginger_island_river = (SVRegion.ginger_island,)
pirate_cove = (SVRegion.pirate_cove,)
fresh_water = (Region.farm, Region.forest, Region.town, Region.mountain)
ocean = (Region.beach,)
town_river = (Region.town,)
mountain_lake = (Region.mountain,)
forest_pond = (Region.forest,)
forest_river = (Region.forest,)
secret_woods = (Region.secret_woods,)
mines_floor_20 = (Region.mines_floor_20,)
mines_floor_60 = (Region.mines_floor_60,)
mines_floor_100 = (Region.mines_floor_100,)
sewers = (Region.sewer,)
desert = (Region.desert,)
mutant_bug_lair = (Region.mutant_bug_lair,)
witch_swamp = (Region.witch_swamp,)
night_market = (Region.beach,)
ginger_island_ocean = (Region.island_south, Region.island_west)
ginger_island_river = (Region.island_west,)
pirate_cove = (Region.pirate_cove,)
all_fish: List[FishItem] = []
def create_fish(name: str, item_id: int, locations: Tuple[str, ...], seasons: Union[str, Tuple[str, ...]],
difficulty: int) -> FishItem:
difficulty: int, mod_name: Optional[str] = None) -> FishItem:
if isinstance(seasons, str):
seasons = (seasons,)
fish_item = FishItem(name, item_id, locations, seasons, difficulty)
fish_item = FishItem(name, item_id, locations, seasons, difficulty, mod_name)
all_fish.append(fish_item)
return fish_item
@@ -94,6 +96,7 @@ sunfish = create_fish("Sunfish", 145, town_river + forest_river, (season.spring,
super_cucumber = create_fish("Super Cucumber", 155, ocean + ginger_island_ocean, (season.summer, season.fall), 80)
tiger_trout = create_fish("Tiger Trout", 699, town_river + forest_river, (season.fall, season.winter), 60)
tilapia = create_fish("Tilapia", 701, ocean + ginger_island_ocean, (season.summer, season.fall), 50)
# Tuna has different seasons on ginger island. Should be changed when the whole fish thing is refactored
tuna = create_fish("Tuna", 130, ocean + ginger_island_ocean, (season.summer, season.winter), 70)
void_salmon = create_fish("Void Salmon", 795, witch_swamp, season.all_seasons, 80)
walleye = create_fish("Walleye", 140, town_river + forest_river + forest_pond + mountain_lake, season.fall, 45)
@@ -122,3 +125,6 @@ snail = create_fish("Snail", 721, fresh_water, season.all_seasons, -1)
legendary_fish = [crimsonfish, angler, legend, glacierfish, mutant_carp]
special_fish = [*legendary_fish, blob_fish, lava_eel, octopus, scorpion_carp, ice_pip, super_cucumber, dorado]
island_fish = [lionfish, blue_discus, stingray]
all_fish_by_name = {fish.name: fish for fish in all_fish}