Skills & Progression

Grandpa's Evaluation

Calculate Grandpa's end-of-Year-2 evaluation score using the GrandpaEvaluator class, which returns a detailed breakdown of points earned across six categories along with the resulting candle count (1--4).

Quick Start

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

const evaluator = grandpaEvaluator()

const result = evaluator.evaluate({
  totalEarnings: 500000,
  totalSkillLevels: 40,
  museumCompleted: true,
  masterAngler: false,
  fullShipment: false,
  married: true,
  villagersAt8Hearts: 8,
  petFriendship: true,
  communityCenterCompleted: true,
  communityCenterCeremonyAttended: true,
  skullKeyObtained: true,
  rustyKeyObtained: true,
})

console.log(`Score: ${result.score}/${result.maxScore}`)
console.log(`Candles: ${result.candles}`)

Type Definitions

GrandpaInput

The input object you pass to evaluate():

FieldTypeDescription
totalEarningsnumberTotal gold earned (lifetime earnings).
totalSkillLevelsnumberSum of all five skill levels (0--50).
museumCompletedbooleanWhether the museum collection is complete (A Complete Collection achievement).
masterAnglerbooleanWhether the Master Angler achievement is earned.
fullShipmentbooleanWhether the Full Shipment achievement is earned.
marriedbooleanWhether the player is married with an upgraded house (kitchen and nursery).
villagersAt8HeartsnumberNumber of villagers at 8 or more hearts.
petFriendshipbooleanWhether the pet is at max friendship.
communityCenterCompletedbooleanWhether the Community Center is fully restored.
communityCenterCeremonyAttendedbooleanWhether the player attended the Community Center completion ceremony.
skullKeyObtainedbooleanWhether the Skull Key has been obtained (reach floor 120 of the mines).
rustyKeyObtainedbooleanWhether the Rusty Key has been obtained (60 museum donations).

GrandpaResult

The result returned by evaluate():

FieldTypeDescription
scorenumberTotal points earned (0--21).
maxScorenumberMaximum possible score (always 21).
candles1 | 2 | 3 | 4Number of candles lit on Grandpa's shrine.
breakdownGrandpaScoreEntry[]Detailed point breakdown by criterion.

GrandpaScoreEntry

Each entry in the breakdown array:

FieldTypeDescription
criterionstringDescription of the scoring criterion.
pointsnumberPoints earned for this criterion.
maxPointsnumberMaximum points available for this criterion.
categoryGrandpaCategoryThe scoring category this belongs to.

GrandpaCategory

A union type of the six scoring categories: 'earnings', 'skills', 'achievements', 'friendship', 'community-center', 'exploration'.

Scoring System

Grandpa's evaluation has a maximum score of 21 points across six categories:

Earnings (0--7 points)

ThresholdPoints
1,000,000g7
500,000g5
300,000g4
200,000g3
100,000g2
50,000g1

Skills (0--2 points)

CriterionPoints
Total skill levels >= 301
Total skill levels >= 501

Achievements (0--3 points)

CriterionPoints
A Complete Collection (museum)1
Master Angler1
Full Shipment1

Friendship (0--4 points)

CriterionPoints
Married with kitchen and nursery1
5+ villagers at 8 hearts1
10+ villagers at 8 hearts1
Pet at max friendship1

Community Center (0--3 points)

CriterionPoints
Community Center completed1
Completion ceremony attended2

Exploration (0--2 points)

CriterionPoints
Skull Key obtained1
Rusty Key obtained1

Candle Thresholds

ScoreCandles
12+4 (best reward)
8--113
4--72
0--31

Examples

Get a full evaluation with breakdown

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

const result = grandpaEvaluator().evaluate({
  totalEarnings: 1000000,
  totalSkillLevels: 50,
  museumCompleted: true,
  masterAngler: true,
  fullShipment: true,
  married: true,
  villagersAt8Hearts: 12,
  petFriendship: true,
  communityCenterCompleted: true,
  communityCenterCeremonyAttended: true,
  skullKeyObtained: true,
  rustyKeyObtained: true,
})

console.log(
  `Score: ${result.score}/${result.maxScore}${result.candles} candles`,
)

result.breakdown.forEach((entry) => {
  console.log(
    `  [${entry.category}] ${entry.criterion}: ${entry.points}/${entry.maxPoints}`,
  )
})

Check what you need for 4 candles

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

const evaluator = grandpaEvaluator()

// Your current progress
const result = evaluator.evaluate({
  totalEarnings: 300000,
  totalSkillLevels: 35,
  museumCompleted: false,
  masterAngler: false,
  fullShipment: false,
  married: true,
  villagersAt8Hearts: 6,
  petFriendship: true,
  communityCenterCompleted: true,
  communityCenterCeremonyAttended: true,
  skullKeyObtained: true,
  rustyKeyObtained: true,
})

const needed = 12 - result.score

if (needed > 0) {
  console.log(`You need ${needed} more points for 4 candles.`)
  console.log('Missing points:')
  result.breakdown
    .filter((e) => e.points < e.maxPoints)
    .forEach((e) => {
      console.log(
        `  ${e.criterion}: ${e.points}/${e.maxPoints} (${e.maxPoints - e.points} available)`,
      )
    })
} else {
  console.log('You already qualify for 4 candles!')
}

Group scores by category

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

const result = grandpaEvaluator().evaluate({
  totalEarnings: 500000,
  totalSkillLevels: 50,
  museumCompleted: true,
  masterAngler: false,
  fullShipment: true,
  married: true,
  villagersAt8Hearts: 10,
  petFriendship: true,
  communityCenterCompleted: true,
  communityCenterCeremonyAttended: true,
  skullKeyObtained: true,
  rustyKeyObtained: false,
})

const byCategory = {}
result.breakdown.forEach((entry) => {
  if (!byCategory[entry.category]) {
    byCategory[entry.category] = { earned: 0, max: 0 }
  }
  byCategory[entry.category].earned += entry.points
  byCategory[entry.category].max += entry.maxPoints
})

Object.entries(byCategory).forEach(([cat, totals]) => {
  console.log(`${cat}: ${totals.earned}/${totals.max}`)
})
Previous
Perfection