ResolutionModeService

Validates recipes against their resolution mode rules and resolves which result groups to produce.

Access: game.fabricate.getResolutionModeService()


Methods

getMode(recipe)

Returns the resolution mode for a recipe (derived from its crafting system).

Returns: string. One of “simple”, “routed”, or “progressive”.

The legacy modes “mapped” and “tiered” are normalised to “routed” on load. getMode() always returns “routed” for recipes that were previously “mapped” or “tiered”.

getProvider(recipe)

Returns the result-selection provider for a routed recipe.

Returns: string. One of “ingredientSet”, “macroOutcome”, or “rollTableOutcome”, or null for non-routed recipes.

validateRecipe(recipe)

Validates that a recipe’s structure is valid for its resolution mode.

Returns: { valid: boolean, errors: string[] }

Hooks.once('fabricate.ready', () => {
  const svc = game.fabricate.getResolutionModeService();
  const result = svc.validateRecipe(myRecipe);
  if (!result.valid) {
    result.errors.forEach(e => console.warn(e));
  }
});

Validation rules by mode:

Mode Rules
Simple Exactly 1 ingredient set, exactly 1 result group
Routed (ingredientSet) 1+ ingredient sets, 1+ result groups, resultGroupId references are valid, and result group names must be unique (case-insensitive)
Routed (macroOutcome) 1+ ingredient sets, 1+ result groups, checks enabled, resultSelection.macroUuid present or system fallback set, result group names are unique and do not use reserved keywords
Routed (rollTableOutcome) 1+ ingredient sets, 1+ result groups, resultSelection.rollTableUuid present, result group names are unique and do not use reserved keywords
Progressive Exactly 1 ingredient set, exactly 1 result group, checks enabled, progressive config exists, all result difficulties >= 1

validateSalvage(component, system)

Validates a component’s salvage configuration against the system’s salvageResolutionMode rules. Analogous to validateRecipe but operates on salvage-specific data shapes.

Returns early as valid when the component has no salvage data or when system is null. Rejects “mapped” mode immediately, as mapped mode is not supported for salvage.

Parameter Type Required Description
component object Yes The component whose salvage configuration to validate. Must have a salvage.resultGroups array for validation to proceed.
system object Yes The crafting system that owns the component. Supplies salvageResolutionMode and salvageCraftingCheck. Pass null to skip validation entirely.

Returns: { valid: boolean, errors: string[] }

Hooks.once('fabricate.ready', () => {
  const svc = game.fabricate.getResolutionModeService();
  const mgr = game.fabricate.getCraftingSystemManager();
  const system = mgr.getSystem('my-alchemy-system');
  const component = system?.components?.find(c => c.id === 'silver-ore-component-id');

  const result = svc.validateSalvage(component, system);
  if (!result.valid) {
    result.errors.forEach(e => ui.notifications.warn(e));
  }
});

Validation rules by salvage mode:

Mode Rules
Simple Exactly 1 result group required.
Routed Crafting checks must be enabled (via salvageCraftingCheck.enabled: true or a non-null macroUuid), at least 1 outcome declared, at least 1 result group present, and every declared outcome must map to a valid result group ID in component.salvage.outcomeRouting.
Progressive Crafting checks must be enabled, salvageCraftingCheck.progressive config must be present, exactly 1 result group required, the group must contain at least 1 ordered result, and every result must reference a component with difficulty >= 1.

Error message examples:

  • 'Mapped mode is not supported for salvage'
  • 'Salvage for "Silver Ore" must have exactly 1 result group in simple mode'
  • 'Routed salvage mode requires crafting checks enabled'
  • 'Routed salvage mode requires at least one declared outcome'
  • 'Outcome "pass" must map to a valid salvage result group for "Silver Ore"'
  • 'Progressive salvage mode requires crafting checks enabled'
  • 'Progressive salvage mode requires salvageCraftingCheck.progressive configuration'
  • 'Salvage for "Silver Ore" requires ordered results in progressive mode'
  • 'Result "r-1" references component without valid difficulty for salvage on "Silver Ore"'

resolveResultGroups(params)

Determines which result groups to create based on the resolution mode and crafting check result. For routed recipes, this dispatches on recipe.resultSelection.provider.

Parameter Type Description
params.recipe Recipe The recipe
params.step object The current step
params.ingredientSet IngredientSet The selected ingredient set
params.checkResult object The crafting check result
params.selectedResultGroupId string Player-selected result group (routed ingredientSet provider only)

Returns: { groups: object[], meta: object }

validateCheckResult(params)

Validates that a crafting check result has the correct shape for the recipe’s mode.

Parameter Type Description
params.recipe Recipe The recipe
params.checkResult object The check result to validate

Returns: boolean


This site uses Just the Docs, a documentation theme for Jekyll.