feat: combined prerequisite capability selectors for entities

This commit is contained in:
Lukas Obermann
2024-01-06 20:08:01 +01:00
parent 12661198c3
commit 63f5807491
3 changed files with 344 additions and 106 deletions
@@ -1,4 +1,5 @@
import { createSelector } from "@reduxjs/toolkit"
import * as FullCheck from "../../shared/domain/prerequisites/fullPrerequisiteValidationForType.ts"
import { checkPrecondition } from "../../shared/domain/prerequisites/prerequisiteValidationForType.ts"
import { checkActivatablePrerequisite } from "../../shared/domain/prerequisites/single/activatablePrerequisiteValidation.ts"
import { checkAncestorBloodPrerequisite } from "../../shared/domain/prerequisites/single/ancestorBloodPrerequisiteValidation.ts"
@@ -495,3 +496,332 @@ export const selectCapabilitiesForMagicalTraditionPrerequisite = createSelector(
getActiveMagicalTraditions: () => activeMagicalTraditions,
}),
)
/**
* Select the capabilities needed to check all prerequisites of a derived characteristic.
*/
export const selectCapabilitiesForPrerequisitesOfDerivedCharacteristic = createSelector(
selectCapabilitiesForRulePrerequisite,
(ruleCaps): Parameters<typeof FullCheck.checkPrerequisitesOfDerivedCharacteristic>[1] => ({
...ruleCaps,
}),
)
/**
* Select the capabilities needed to check all prerequisites of a publication.
*/
export const selectCapabilitiesForPrerequisitesOfPublication = createSelector(
selectCapabilitiesForPublicationPrerequisite,
(publicationCaps): Parameters<typeof FullCheck.checkPrerequisitesOfPublication>[1] => ({
...publicationCaps,
}),
)
/**
* Select the capabilities needed to check all prerequisites of a general entry.
*/
export const selectCapabilitiesForPrerequisitesOfGeneralEntry = createSelector(
selectCapabilitiesForSexPrerequisite,
selectCapabilitiesForRacePrerequisite,
selectCapabilitiesForCulturePrerequisite,
selectCapabilitiesForPactPrerequisite,
selectCapabilitiesForSocialStatusPrerequisite,
selectCapabilitiesForStatePrerequisite,
selectCapabilitiesForRulePrerequisite,
selectCapabilitiesForPrimaryAttributePrerequisite,
selectCapabilitiesForActivatablePrerequisite,
selectCapabilitiesForBlessedTraditionPrerequisite,
selectCapabilitiesForMagicalTraditionPrerequisite,
selectCapabilitiesForRatedPrerequisite,
selectCapabilitiesForRatedMinimumNumberPrerequisite,
selectCapabilitiesForRatedSumPrerequisite,
selectCapabilitiesForExternalEnhancementPrerequisite,
selectCapabilitiesForTextPrerequisite,
selectCapabilitiesForSexualCharacteristicPrerequisite,
(
sexCaps,
raceCaps,
cultureCaps,
pactCaps,
socialStatusCaps,
stateCaps,
ruleCaps,
primaryAttributeCaps,
activatableCaps,
blessedTraditionCaps,
magicalTraditionCaps,
ratedCaps,
ratedMinimumNumberCaps,
ratedSumCaps,
externalEnhancementCaps,
textCaps,
sexualCharacteristicCaps,
): Parameters<typeof FullCheck.checkPrerequisitesOfGeneralEntry>[1] => ({
...sexCaps,
...raceCaps,
...cultureCaps,
...pactCaps,
...socialStatusCaps,
...stateCaps,
...ruleCaps,
...primaryAttributeCaps,
...activatableCaps,
...blessedTraditionCaps,
...magicalTraditionCaps,
...ratedCaps,
...ratedMinimumNumberCaps,
...ratedSumCaps,
...externalEnhancementCaps,
...textCaps,
...sexualCharacteristicCaps,
}),
)
/**
* Select the capabilities needed to check all prerequisites of a general entry with levels.
*/
export const selectCapabilitiesForPrerequisitesOfGeneralEntryWithLevels = createSelector(
selectCapabilitiesForSexPrerequisite,
selectCapabilitiesForRacePrerequisite,
selectCapabilitiesForCulturePrerequisite,
selectCapabilitiesForPactPrerequisite,
selectCapabilitiesForSocialStatusPrerequisite,
selectCapabilitiesForStatePrerequisite,
selectCapabilitiesForRulePrerequisite,
selectCapabilitiesForPrimaryAttributePrerequisite,
selectCapabilitiesForActivatablePrerequisite,
selectCapabilitiesForBlessedTraditionPrerequisite,
selectCapabilitiesForMagicalTraditionPrerequisite,
selectCapabilitiesForRatedPrerequisite,
selectCapabilitiesForRatedMinimumNumberPrerequisite,
selectCapabilitiesForRatedSumPrerequisite,
selectCapabilitiesForExternalEnhancementPrerequisite,
selectCapabilitiesForTextPrerequisite,
selectCapabilitiesForSexualCharacteristicPrerequisite,
(
sexCaps,
raceCaps,
cultureCaps,
pactCaps,
socialStatusCaps,
stateCaps,
ruleCaps,
primaryAttributeCaps,
activatableCaps,
blessedTraditionCaps,
magicalTraditionCaps,
ratedCaps,
ratedMinimumNumberCaps,
ratedSumCaps,
externalEnhancementCaps,
textCaps,
sexualCharacteristicCaps,
): Parameters<typeof FullCheck.checkPrerequisitesOfGeneralEntryWithLevels>[2] => ({
...sexCaps,
...raceCaps,
...cultureCaps,
...pactCaps,
...socialStatusCaps,
...stateCaps,
...ruleCaps,
...primaryAttributeCaps,
...activatableCaps,
...blessedTraditionCaps,
...magicalTraditionCaps,
...ratedCaps,
...ratedMinimumNumberCaps,
...ratedSumCaps,
...externalEnhancementCaps,
...textCaps,
...sexualCharacteristicCaps,
}),
)
/**
* Select the capabilities needed to check all prerequisites of a profession.
*/
export const selectCapabilitiesForPrerequisitesOfProfession = createSelector(
selectCapabilitiesForSexPrerequisite,
selectCapabilitiesForRacePrerequisite,
selectCapabilitiesForCulturePrerequisite,
selectCapabilitiesForActivatablePrerequisite,
selectCapabilitiesForRatedPrerequisite,
(
sexCaps,
raceCaps,
cultureCaps,
activatableCaps,
ratedCaps,
): Parameters<typeof FullCheck.checkPrerequisitesOfProfession>[1] => ({
...sexCaps,
...raceCaps,
...cultureCaps,
...activatableCaps,
...ratedCaps,
}),
)
/**
* Select the capabilities needed to check all prerequisites of an advantage or disadvantage.
*/
export const selectCapabilitiesForPrerequisitesOfAdvantageOrDisadvantage = createSelector(
selectCapabilitiesForCommonSuggestedByRCPPrerequisite,
selectCapabilitiesForSexPrerequisite,
selectCapabilitiesForRacePrerequisite,
selectCapabilitiesForCulturePrerequisite,
selectCapabilitiesForPactPrerequisite,
selectCapabilitiesForSocialStatusPrerequisite,
selectCapabilitiesForStatePrerequisite,
selectCapabilitiesForRulePrerequisite,
selectCapabilitiesForPrimaryAttributePrerequisite,
selectCapabilitiesForActivatablePrerequisite,
selectCapabilitiesForBlessedTraditionPrerequisite,
selectCapabilitiesForMagicalTraditionPrerequisite,
selectCapabilitiesForRatedPrerequisite,
selectCapabilitiesForRatedMinimumNumberPrerequisite,
selectCapabilitiesForRatedSumPrerequisite,
selectCapabilitiesForExternalEnhancementPrerequisite,
selectCapabilitiesForTextPrerequisite,
selectCapabilitiesForAncestorBloodPrerequisite,
selectCapabilitiesForSexualCharacteristicPrerequisite,
(
commonSuggestedByRCPCaps,
sexCaps,
raceCaps,
cultureCaps,
pactCaps,
socialStatusCaps,
stateCaps,
ruleCaps,
primaryAttributeCaps,
activatableCaps,
blessedTraditionCaps,
magicalTraditionCaps,
ratedCaps,
ratedMinimumNumberCaps,
ratedSumCaps,
externalEnhancementCaps,
textCaps,
ancestorBloodCaps,
sexualCharacteristicCaps,
): Parameters<typeof FullCheck.checkPrerequisitesOfAdvantageOrDisadvantage>[4] => ({
...commonSuggestedByRCPCaps,
...sexCaps,
...raceCaps,
...cultureCaps,
...pactCaps,
...socialStatusCaps,
...stateCaps,
...ruleCaps,
...primaryAttributeCaps,
...activatableCaps,
...blessedTraditionCaps,
...magicalTraditionCaps,
...ratedCaps,
...ratedMinimumNumberCaps,
...ratedSumCaps,
...externalEnhancementCaps,
...textCaps,
...ancestorBloodCaps,
...sexualCharacteristicCaps,
}),
)
/**
* Select the capabilities needed to check all prerequisites of an arcane tradition.
*/
export const selectCapabilitiesForPrerequisitesOfArcaneTradition = createSelector(
selectCapabilitiesForSexPrerequisite,
selectCapabilitiesForCulturePrerequisite,
(sexCaps, cultureCaps): Parameters<typeof FullCheck.checkPrerequisitesOfArcaneTradition>[1] => ({
...sexCaps,
...cultureCaps,
}),
)
/**
* Select the capabilities needed to check all prerequisites of a personality trait.
*/
export const selectCapabilitiesForPrerequisitesOfPersonalityTrait = createSelector(
selectCapabilitiesForCulturePrerequisite,
selectCapabilitiesForTextPrerequisite,
(
cultureCaps,
textCaps,
): Parameters<typeof FullCheck.checkPrerequisitesOfPersonalityTrait>[1] => ({
...cultureCaps,
...textCaps,
}),
)
/**
* Select the capabilities needed to check all prerequisites of a spellwork.
*/
export const selectCapabilitiesForPrerequisitesOfSpellwork = createSelector(
selectCapabilitiesForRulePrerequisite,
selectCapabilitiesForRatedPrerequisite,
(ruleCaps, ratedCaps): Parameters<typeof FullCheck.checkPrerequisitesOfSpellwork>[1] => ({
...ruleCaps,
...ratedCaps,
}),
)
/**
* Select the capabilities needed to check all prerequisites of a liturgy.
*/
export const selectCapabilitiesForPrerequisitesOfLiturgy = createSelector(
selectCapabilitiesForRulePrerequisite,
(ruleCaps): Parameters<typeof FullCheck.checkPrerequisitesOfLiturgy>[1] => ({
...ruleCaps,
}),
)
/**
* Select the capabilities needed to check all prerequisites of an influence.
*/
export const selectCapabilitiesForPrerequisitesOfInfluence = createSelector(
selectCapabilitiesForInfluencePrerequisite,
selectCapabilitiesForTextPrerequisite,
(influenceCaps, textCaps): Parameters<typeof FullCheck.checkPrerequisitesOfInfluence>[1] => ({
...influenceCaps,
...textCaps,
}),
)
/**
* Select the capabilities needed to check all prerequisites of a language.
*/
export const selectCapabilitiesForPrerequisitesOfLanguage = createSelector(
selectCapabilitiesForRacePrerequisite,
selectCapabilitiesForActivatablePrerequisite,
selectCapabilitiesForTextPrerequisite,
(
raceCaps,
activatableCaps,
textCaps,
): Parameters<typeof FullCheck.checkPrerequisitesOfLanguage>[2] => ({
...raceCaps,
...activatableCaps,
...textCaps,
}),
)
/**
* Select the capabilities needed to check all prerequisites of an animist power.
*/
export const selectCapabilitiesForPrerequisitesOfAnimistPower = createSelector(
selectCapabilitiesForAnimistPowerPrerequisite,
(animistPowerCaps): Parameters<typeof FullCheck.checkPrerequisitesOfAnimistPower>[1] => ({
...animistPowerCaps,
}),
)
/**
* Select the capabilities needed to check all prerequisites of a geode ritual.
*/
export const selectCapabilitiesForPrerequisitesOfGeodeRitual = createSelector(
selectCapabilitiesForInfluencePrerequisite,
(influenceCaps): Parameters<typeof FullCheck.checkPrerequisitesOfGeodeRitual>[1] => ({
...influenceCaps,
}),
)
+7 -63
View File
@@ -54,22 +54,15 @@ import {
selectDynamicAnimistPowers,
selectDynamicAttributes,
selectDynamicCantrips,
selectDynamicCeremonies,
selectDynamicCloseCombatTechniques,
selectDynamicCurses,
selectDynamicDominationRituals,
selectDynamicElvenMagicalSongs,
selectDynamicFocusRules,
selectDynamicGeodeRituals,
selectDynamicJesterTricks,
selectDynamicLiturgicalChants,
selectDynamicMagicalDances,
selectDynamicMagicalMelodies,
selectDynamicMagicalSpecialAbilities,
selectDynamicOptionalRules,
selectDynamicRangedCombatTechniques,
selectDynamicRituals,
selectDynamicSkills,
selectDynamicSpells,
selectDynamicZibiljaRituals,
} from "../slices/characterSlice.ts"
@@ -90,6 +83,7 @@ import {
import { selectCanRemove, selectIsInCharacterCreation } from "./characterSelectors.ts"
import { selectFilterApplyingRatedDependencies } from "./dependencySelectors.ts"
import { selectStartExperienceLevel } from "./experienceLevelSelectors.ts"
import { selectCapabilitiesForPrerequisitesOfSpellwork } from "./prerequisiteSelectors.ts"
import { selectIsEntryAvailable } from "./publicationSelectors.ts"
import { selectActiveMagicalTraditions } from "./traditionSelectors.ts"
@@ -873,15 +867,7 @@ export const selectVisibleInactiveSpells = createSelector(
MagicalSpecialAbilityIdentifier.Imitationszauberei,
),
selectIsEntryAvailable,
selectDynamicFocusRules,
selectDynamicOptionalRules,
selectDynamicAttributes,
selectDynamicSkills,
selectDynamicCloseCombatTechniques,
selectDynamicRangedCombatTechniques,
selectDynamicRituals,
selectDynamicLiturgicalChants,
selectDynamicCeremonies,
selectCapabilitiesForPrerequisitesOfSpellwork,
selectGetIsUnfamiliar,
(
staticSpells,
@@ -893,15 +879,7 @@ export const selectVisibleInactiveSpells = createSelector(
isMaximumUnfamiliarCountReached,
imitationszauberei,
isEntryAvailable,
dynamicFocusRules,
dynamicOptionalRules,
dynamicAttributes,
dynamicSkills,
dynamicCloseCombatTechniques,
dynamicRangedCombatTechniques,
dynamicRituals,
dynamicLiturgicalChants,
dynamicCeremonies,
prerequisiteCapabilities,
getIsUnfamiliar,
): DisplayedInactiveSpell[] =>
getInactiveSpellsOrRituals(
@@ -915,16 +893,7 @@ export const selectVisibleInactiveSpells = createSelector(
isMaximumUnfamiliarCountReached,
imitationszauberei,
isEntryAvailable,
id => dynamicFocusRules[id],
id => dynamicOptionalRules[id],
id => dynamicAttributes[id],
id => dynamicSkills[id],
id => dynamicCloseCombatTechniques[id],
id => dynamicRangedCombatTechniques[id],
id => dynamicSpells[id],
id => dynamicRituals[id],
id => dynamicLiturgicalChants[id],
id => dynamicCeremonies[id],
prerequisiteCapabilities,
id => getIsUnfamiliar(createIdentifierObject("Spell", id)),
),
)
@@ -946,15 +915,7 @@ export const selectVisibleInactiveRituals = createSelector(
MagicalSpecialAbilityIdentifier.Imitationszauberei,
),
selectIsEntryAvailable,
selectDynamicFocusRules,
selectDynamicOptionalRules,
selectDynamicAttributes,
selectDynamicSkills,
selectDynamicCloseCombatTechniques,
selectDynamicRangedCombatTechniques,
selectDynamicSpells,
selectDynamicLiturgicalChants,
selectDynamicCeremonies,
selectCapabilitiesForPrerequisitesOfSpellwork,
selectGetIsUnfamiliar,
(
staticRituals,
@@ -966,15 +927,7 @@ export const selectVisibleInactiveRituals = createSelector(
isMaximumUnfamiliarCountReached,
imitationszauberei,
isEntryAvailable,
dynamicFocusRules,
dynamicOptionalRules,
dynamicAttributes,
dynamicSkills,
dynamicCloseCombatTechniques,
dynamicRangedCombatTechniques,
dynamicSpells,
dynamicLiturgicalChants,
dynamicCeremonies,
prerequisiteCapabilities,
getIsUnfamiliar,
): DisplayedInactiveRitual[] =>
getInactiveSpellsOrRituals(
@@ -988,16 +941,7 @@ export const selectVisibleInactiveRituals = createSelector(
isMaximumUnfamiliarCountReached,
imitationszauberei,
isEntryAvailable,
id => dynamicFocusRules[id],
id => dynamicOptionalRules[id],
id => dynamicAttributes[id],
id => dynamicSkills[id],
id => dynamicCloseCombatTechniques[id],
id => dynamicRangedCombatTechniques[id],
id => dynamicSpells[id],
id => dynamicRituals[id],
id => dynamicLiturgicalChants[id],
id => dynamicCeremonies[id],
prerequisiteCapabilities,
id => getIsUnfamiliar(createIdentifierObject("Ritual", id)),
),
)
+7 -43
View File
@@ -24,7 +24,6 @@ import {
compareImprovementCost,
fromRaw,
} from "../adventurePoints/improvementCost.ts"
import { GetById } from "../getTypes.ts"
import { MagicalTraditionIdentifier } from "../identifier.ts"
import { checkPrerequisitesOfSpellwork } from "../prerequisites/fullPrerequisiteValidationForType.ts"
import {
@@ -221,26 +220,8 @@ export const getVisibleInactiveCantrips = (
* @param imitationszauberei The dynamic *Imitationszauberei* entry, if present.
* @param isEntryAvailable A function that checks whether a spell or ritual is
* available based on the active publications.
* @param getDynamicFocusRuleById Returns the dynamic focus rule entry by
* identifier, if present.
* @param getDynamicOptionalRuleById Returns the dynamic optional rule entry by
* identifier, if present.
* @param getDynamicAttributeById Returns the dynamic attribute entry by
* identifier, if present.
* @param getDynamicSkillById Returns the dynamic skill entry by identifier, if
* present.
* @param getDynamicCloseCombatTechniqueById Returns the dynamic close combat
* technique entry by identifier, if present.
* @param getDynamicRangedCombatTechniqueById Returns the dynamic ranged combat
* technique entry by identifier, if present.
* @param getDynamicSpellById Returns the dynamic spell entry by identifier, if
* present.
* @param getDynamicRitualById Returns the dynamic ritual entry by identifier,
* if present.
* @param getDynamicLiturgicalChantById Returns the dynamic liturgical chant
* entry by identifier, if present.
* @param getDynamicCeremonyById Returns the dynamic ceremony entry by
* identifier, if present.
* @param prerequisiteCapabilities All capabilities that are needed to check the
* prerequisites of the spell or ritual.
* @param getIsUnfamiliar Returns if the spell or ritual (depending on the
* `kind` parameter) is unfamiliar.
*/
@@ -255,16 +236,7 @@ export const getInactiveSpellsOrRituals = <K extends "spell" | "ritual", T exten
isMaximumUnfamiliarCountReached: boolean,
imitationszauberei: Activatable | undefined,
isEntryAvailable: (src: PublicationRefs) => boolean,
getDynamicFocusRuleById: GetById.Dynamic.FocusRule,
getDynamicOptionalRuleById: GetById.Dynamic.OptionalRule,
getDynamicAttributeById: GetById.Dynamic.Attribute,
getDynamicSkillById: GetById.Dynamic.Skill,
getDynamicCloseCombatTechniqueById: GetById.Dynamic.CloseCombatTechnique,
getDynamicRangedCombatTechniqueById: GetById.Dynamic.RangedCombatTechnique,
getDynamicSpellById: GetById.Dynamic.Spell,
getDynamicRitualById: GetById.Dynamic.Ritual,
getDynamicLiturgicalChantById: GetById.Dynamic.LiturgicalChant,
getDynamicCeremonyById: GetById.Dynamic.Ceremony,
prerequisiteCapabilities: Parameters<typeof checkPrerequisitesOfSpellwork>[1],
getIsUnfamiliar: (id: number) => boolean,
): {
kind: K
@@ -363,18 +335,10 @@ export const getInactiveSpellsOrRituals = <K extends "spell" | "ritual", T exten
!isMaximumCountReached &&
(!isUnfamiliar || !isMaximumUnfamiliarCountReached) &&
additionalSoftPredicate(staticSpellwork) &&
checkPrerequisitesOfSpellwork(staticSpellwork.prerequisites ?? [], {
getDynamicFocusRuleById,
getDynamicOptionalRuleById,
getDynamicAttributeById,
getDynamicSkillById,
getDynamicCloseCombatTechniqueById,
getDynamicRangedCombatTechniqueById,
getDynamicSpellById,
getDynamicRitualById,
getDynamicLiturgicalChantById,
getDynamicCeremonyById,
}),
checkPrerequisitesOfSpellwork(
staticSpellwork.prerequisites ?? [],
prerequisiteCapabilities,
),
isUnfamiliar,
}
})