Stardew Valley: Refactor skill progression to use new feature system (#3662)
* create a first draft of the feature * use feature in items and locations * add content to more places * use feature in logic * replace option check by feature * remove unused code * remove weird white space * some import nitpicking * flip negative if
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
from . import content_packs
|
||||
from .feature import cropsanity, friendsanity, fishsanity, booksanity
|
||||
from .feature import cropsanity, friendsanity, fishsanity, booksanity, skill_progression
|
||||
from .game_content import ContentPack, StardewContent, StardewFeatures
|
||||
from .unpacking import unpack_content
|
||||
from .. import options
|
||||
@@ -31,7 +31,8 @@ def choose_features(player_options: options.StardewValleyOptions) -> StardewFeat
|
||||
choose_booksanity(player_options.booksanity),
|
||||
choose_cropsanity(player_options.cropsanity),
|
||||
choose_fishsanity(player_options.fishsanity),
|
||||
choose_friendsanity(player_options.friendsanity, player_options.friendsanity_heart_size)
|
||||
choose_friendsanity(player_options.friendsanity, player_options.friendsanity_heart_size),
|
||||
choose_skill_progression(player_options.skill_progression),
|
||||
)
|
||||
|
||||
|
||||
@@ -105,3 +106,19 @@ def choose_friendsanity(friendsanity_option: options.Friendsanity, heart_size: o
|
||||
return friendsanity.FriendsanityAllWithMarriage(heart_size.value)
|
||||
|
||||
raise ValueError(f"No friendsanity feature mapped to {str(friendsanity_option.value)}")
|
||||
|
||||
|
||||
skill_progression_by_option = {
|
||||
options.SkillProgression.option_vanilla: skill_progression.SkillProgressionVanilla(),
|
||||
options.SkillProgression.option_progressive: skill_progression.SkillProgressionProgressive(),
|
||||
options.SkillProgression.option_progressive_with_masteries: skill_progression.SkillProgressionProgressiveWithMasteries(),
|
||||
}
|
||||
|
||||
|
||||
def choose_skill_progression(skill_progression_option: options.SkillProgression) -> skill_progression.SkillProgressionFeature:
|
||||
skill_progression_feature = skill_progression_by_option.get(skill_progression_option)
|
||||
|
||||
if skill_progression_feature is None:
|
||||
raise ValueError(f"No skill progression feature mapped to {str(skill_progression_option.value)}")
|
||||
|
||||
return skill_progression_feature
|
||||
|
||||
@@ -2,3 +2,4 @@ from . import booksanity
|
||||
from . import cropsanity
|
||||
from . import fishsanity
|
||||
from . import friendsanity
|
||||
from . import skill_progression
|
||||
|
||||
46
worlds/stardew_valley/content/feature/skill_progression.py
Normal file
46
worlds/stardew_valley/content/feature/skill_progression.py
Normal file
@@ -0,0 +1,46 @@
|
||||
from abc import ABC, abstractmethod
|
||||
from typing import ClassVar, Iterable, Tuple
|
||||
|
||||
from ...data.skill import Skill
|
||||
|
||||
|
||||
class SkillProgressionFeature(ABC):
|
||||
is_progressive: ClassVar[bool]
|
||||
are_masteries_shuffled: ClassVar[bool]
|
||||
|
||||
@abstractmethod
|
||||
def get_randomized_level_names_by_level(self, skill: Skill) -> Iterable[Tuple[int, str]]:
|
||||
...
|
||||
|
||||
@abstractmethod
|
||||
def is_mastery_randomized(self, skill: Skill) -> bool:
|
||||
...
|
||||
|
||||
|
||||
class SkillProgressionVanilla(SkillProgressionFeature):
|
||||
is_progressive = False
|
||||
are_masteries_shuffled = False
|
||||
|
||||
def get_randomized_level_names_by_level(self, skill: Skill) -> Iterable[Tuple[int, str]]:
|
||||
return ()
|
||||
|
||||
def is_mastery_randomized(self, skill: Skill) -> bool:
|
||||
return False
|
||||
|
||||
|
||||
class SkillProgressionProgressive(SkillProgressionFeature):
|
||||
is_progressive = True
|
||||
are_masteries_shuffled = False
|
||||
|
||||
def get_randomized_level_names_by_level(self, skill: Skill) -> Iterable[Tuple[int, str]]:
|
||||
return skill.level_names_by_level
|
||||
|
||||
def is_mastery_randomized(self, skill: Skill) -> bool:
|
||||
return False
|
||||
|
||||
|
||||
class SkillProgressionProgressiveWithMasteries(SkillProgressionProgressive):
|
||||
are_masteries_shuffled = True
|
||||
|
||||
def is_mastery_randomized(self, skill: Skill) -> bool:
|
||||
return skill.has_mastery
|
||||
@@ -3,7 +3,7 @@ from __future__ import annotations
|
||||
from dataclasses import dataclass, field
|
||||
from typing import Dict, Iterable, Set, Any, Mapping, Type, Tuple, Union
|
||||
|
||||
from .feature import booksanity, cropsanity, fishsanity, friendsanity
|
||||
from .feature import booksanity, cropsanity, fishsanity, friendsanity, skill_progression
|
||||
from ..data.fish_data import FishItem
|
||||
from ..data.game_item import GameItem, ItemSource, ItemTag
|
||||
from ..data.skill import Skill
|
||||
@@ -53,6 +53,7 @@ class StardewFeatures:
|
||||
cropsanity: cropsanity.CropsanityFeature
|
||||
fishsanity: fishsanity.FishsanityFeature
|
||||
friendsanity: friendsanity.FriendsanityFeature
|
||||
skill_progression: skill_progression.SkillProgressionFeature
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
|
||||
Reference in New Issue
Block a user