Farming & Foraging

Artisan Goods

Access artisan good data including processing equipment, ingredients, cask aging, and dynamic price formulas.

Quick Start

import { artisanGoods, calculateArtisanPrice } from 'stardew-valley-data'

// All artisan goods
const all = artisanGoods().get()

// Goods made with a Keg
const kegGoods = artisanGoods().byEquipment('Keg').get()

// Goods that can be aged in a Cask
const caskable = artisanGoods().caskAgeable().get()

// Calculate price from ingredient
const wine = artisanGoods().findByName('Wine')
if (wine) {
  const price = calculateArtisanPrice(wine, 150) // 150g ingredient
  console.log(`Wine sell price: ${price}g`)
}

Type Definition

interface ArtisanGood {
  id: string
  name: string
  description: string
  equipment: string
  ingredients: ArtisanIngredient[]
  processingMinutes: number
  processingDays: number
  sellPrice: number | null
  sellPriceFormula: string | null
  priceFormula: PriceFormula | null
  qualityLevels: boolean
  cask: CaskAging | null
  image: string
}

Field Reference

FieldTypeDescription
idstringUnique identifier.
namestringDisplay name (e.g. "Wine", "Cheese").
descriptionstringIn-game description text.
equipmentstringEquipment used to produce this good (e.g. "Keg", "Preserves Jar").
ingredientsArtisanIngredient[]Array of required ingredients.
processingMinutesnumberIn-game processing time in minutes.
processingDaysnumberApproximate processing time in days.
sellPricenumber | nullFixed sell price, or null if the price is formula-based.
sellPriceFormulastring | nullHuman-readable formula string (e.g. "2 * Base Price + 50"), or null for fixed-price goods.
priceFormulaPriceFormula | nullStructured formula for calculating sell price from an ingredient, or null.
qualityLevelsbooleanWhether this good supports Silver/Gold/Iridium quality.
caskCaskAging | nullCask aging data, or null if it cannot be aged.
imagestringPath to the image asset.

Supporting Types

interface ArtisanIngredient {
  name: string
  id: string | null
  quantity: number | null
}

interface PriceFormula {
  multiplier: number
  addend: number
}

interface CaskAging {
  silverDays: number
  goldDays: number
  iridiumDays: number
}

Query Methods

The artisanGoods() function returns an ArtisanGoodQuery instance. All methods return a new ArtisanGoodQuery for chaining.

Inherited Methods

MethodReturnsDescription
.get()ArtisanGood[]Return all results as an array.
.first()ArtisanGood | undefinedReturn the first result.
.find(id)ArtisanGood | undefinedFind by exact ID.
.findByName(name)ArtisanGood | undefinedFind by name (case-insensitive).
.count()numberReturn the number of results.

Filter Methods

MethodSignatureDescription
byEquipmentbyEquipment(equipment: string)Filter by the equipment that produces the good (case-insensitive).
caskAgeablecaskAgeable()Filter to goods that can be aged in a Cask.
withQualityLevelswithQualityLevels()Filter to goods that support Silver/Gold/Iridium quality.
fixedPricefixedPrice()Filter to goods with a fixed sell price (not formula-based).
formulaPriceformulaPrice()Filter to goods whose sell price depends on the ingredient.

Helper Functions

calculateArtisanPrice

function calculateArtisanPrice(
  good: ArtisanGood,
  ingredientBasePrice: number,
): number | null

Calculate the sell price of a formula-based artisan good given the ingredient's base price. Returns null if the good has a fixed price (no formula).

The formula applied is: Math.floor(ingredientBasePrice * multiplier) + addend

applyPriceFormula

function applyPriceFormula(
  formula: PriceFormula,
  ingredientBasePrice: number,
): number

Apply a PriceFormula directly to an ingredient base price. Useful when you already have a formula object.

Examples

Keg products and their processing times

import { artisanGoods } from 'stardew-valley-data'

const kegGoods = artisanGoods().byEquipment('Keg').get()

kegGoods.forEach((g) => {
  console.log(`${g.name}: ${g.processingDays} day(s)`)
})

Calculate wine sell prices for different fruits

import { artisanGoods, calculateArtisanPrice } from 'stardew-valley-data'

const wine = artisanGoods().findByName('Wine')
const fruitPrices = [50, 150, 300, 750] // base prices of various fruits

if (wine) {
  fruitPrices.forEach((base) => {
    const sellPrice = calculateArtisanPrice(wine, base)
    console.log(`${base}g fruit -> Wine sells for ${sellPrice}g`)
  })
}

Cask aging breakdown

const caskable = artisanGoods().caskAgeable().get()

caskable.forEach((g) => {
  if (g.cask) {
    console.log(
      `${g.name}: Silver ${g.cask.silverDays}d, Gold ${g.cask.goldDays}d, Iridium ${g.cask.iridiumDays}d`,
    )
  }
})

Fixed-price vs formula-price goods

const fixedCount = artisanGoods().fixedPrice().count()
const formulaCount = artisanGoods().formulaPrice().count()

console.log(
  `${fixedCount} fixed-price goods, ${formulaCount} formula-based goods`,
)
Previous
Animals