On this page
  1. Related
  2. Mechanics
  3. References
  4. Sources

Every claim here reads harvestwhisperer’s matching decompilation of Harvest Moon 64, built as the US release; the Japanese build differs in places the code marks.

The farm is a grid of tile numbers, and a crop is a run of them. Each night a watered stage moves on and a dry one waits, so a turnip takes 4 watered days and corn 131. Rain waters every waterable tile outside the greenhouse2. The first night of a season applies that season’s list: summer kills turnips, potatoes, and cabbages; autumn kills tomatoes, corn, moondrop flowers, and pink cat mint; winter clears seed stages, eggplants, and dead plants to bare ground. Spring kills nothing, and the greenhouse has no season rule3.

Tools cost stamina by tool and charge level, and working in rain, in snow, or after dark also adds fatigue4. Bed refills stamina; staying up until 6:00 doesn’t5.

A cow’s affection sets its milk size6. The function that scales each change by the cow’s mood negates an amount that is already negative, so for a mad, sick, or happy cow a loss comes out as a gain7.

Mechanics

MechanicKindHow
Crop growthWatered daysa crop moves one stage each night after a watered day; turnips take 4 watered days, corn 13, and the first nights of summer, autumn, and winter kill or clear named crops
CalendarSeasonsfour seasons of 30 days, each day turning over at 6:00
Time of dayGame clock10 game seconds per loop step on maps where time flows, at most 10 game minutes per real second
StaminaDailyeach tool use costs 1 to 6 stamina by tool and charge, work in rain or at night adds fatigue, and a night in bed refills stamina
AffectionPointsa cow's affection from 0 to 255 sets its milk size, and its mood scales each change
Every claim about this game, by concept (10)
AffectionIn the US release, a cow's milk size comes from its affection (0 to 255): small at 150 or less, medium from 151 to 220, large from 221, and golden for a cow whose milkType is 0, whatever its affection.Code
In the US release, adjustFarmAnimalAffection scales a change by an adult cow's condition: a happy cow's gains are doubled and a mad or sick cow's halved. Its loss branch negates the scaled amount, -(amount * 2) for mad and sick and -(amount / 2) for happy, and since the amount is already negative, the result is positive: a loss raises a mad, sick, or happy cow's affection, by twice or half the loss (computed). Leaving an adult cow outdoors on a rainy day can trigger this: updateFarmStatusRain makes it mad when getRandomNumberInRange(0, 3) returns 0 and then applies −20, or sick when getRandomNumberInRange(0, 7) returns 0 and then applies −30, and a cow already sick gets −20.Code
CalendarIn the US release, updateClock adds a day to the date and the day of the week when the hour rolls over to 6:00, and going to bed sets the clock to 6:00 and adds the day itself. Day 31 becomes day 1 of the next season, and the fifth season is spring of the next year: four seasons of 30 days, with the year capped at 99.Code
Crop growthIn the US release, a crop is a run of tile numbers in groundObjectsInfo, each growth stage a dry tile followed by its watered twin. The watering can turns a waterable tile into the next number (dry soil into watered soil). Each night, updateGroundObjectsOvernight reads a flag byte per tile: a watered stage moves on to the next stage's dry tile, watered soil and a watered ripe crop go back to dry, and a dry stage stays where it is. So a crop grows one stage per watered day and a dry day doesn't count. Worked out from the table (computed), the watered days from sowing to ripe are: turnip 4, potato 6, strawberry 6, moondrop flower 6, cabbage 7, eggplant 7, pink cat mint 8, tomato 9, corn 13. Grass's stages aren't waterable and advance every night: 9 nights from seed.Code
In the US release, picking a ripe tomato, ear of corn, or eggplant puts back an earlier stage (tile 0x5F, TOMATO_PLANT_STAGE_1; 0x7A, CORN_PLANT_STAGE_1; 0x2A, EGGPLANT_STALK_STAGE_1) under a comment reading "replace with stalks", so the plant ripens again after 3, 4, and 3 more watered days (computed from the table). Any other crop picked leaves soil (dry or watered, as the ripe tile was) or a bare tile.Code
In the US release, the farm's overnight update has a rule for the night that starts a season (the day of the month is 1 by then). Summer turns sprouted-or-older turnips, potatoes, and cabbages into dead plants and their seed stages back into tilled soil. Autumn does the same to tomatoes, corn, moondrop flowers, and pink cat mint, and sends any spring seed stages to tilled soil. Winter clears dry tilled soil, weeds, eggplants at every stage, the dead plants, and the remaining seed stages to the bare tile. Spring turns grass back to cut grass and returns tilled soil to the bare tile when getRandomNumberInRange(0, 5) >= 3. Strawberries, whose seeds sow only in the greenhouse, appear in none of the lists, and the greenhouse loop has no season rule.Code
In the US release, each night the new day's weather is set before the crops update; then, if it is rain, updateCropsIfRain turns every waterable tile on the farm into its watered twin, as the watering can would, so a rainy day counts as watered. The greenhouse isn't touched.Code
StaminaIn the US release, toolToFatigueScore gives each tool a stamina cost per charge level: the sickle and hoe 2, 4, and 6; the ax and hammer 1, 2, and 3; the watering can 1, 2, and 6; the milker, bell, brush, clippers, the seed bags, and grass seeds 1; the rest 0. Releasing B subtracts the cost from stamina. If it is raining or snowing, or the hour is before 6:00 or from 18:00, and the player isn't in the greenhouse, the same cost is added to fatigue (out of 100), or half of it once a life-event flag the decompilers name KAPPA_POWER_NUT_GIFT is set. Holding B raises the charge level each time a hold counter reaches 16, up to the tool's upgrade level, while stamina covers the next level's cost.Code
In the US release, going to bed refills stamina to its maximum and, unless fatigue is at 100, takes 2 points of fatigue off for each hour of sleep before 6:00, 3 with the cushion (life event HAVE_CUSHION): the hour taken is the bedtime, plus 24 if before 6:00, subtracted from 30. Staying up until 6:00 runs the next day's update by another path that doesn't touch stamina or fatigue. Food and drink add the item's stamina value and take off its fatigue value.Code
Time of dayIn the US release, each step of the gameplay loop adds 10 to the clock's seconds, as long as the map's LEVEL_TIME_FLOWS flag is set, no animation has suspended time, and the player entity passes checkEntityMapSpaceDependent and isn't paused; 60 seconds make a minute. So a game minute is 6 steps and a game hour 360. The main loop steps at most once per video retrace (mainLoopUpdateInterval is 1), and the retrace callback counts 60 calls as its cycle. Assuming 60 retraces a second (NTSC's rate is about 59.94), the clock runs at most 10 game minutes per real second, an hour in 6 real seconds (computed under that assumption). The real rate depends on how many steps the game finishes each second, which the atlas hasn't measured.Code

References

  1. ^In the US release, a crop is a run of tile numbers in groundObjectsInfo, each growth stage a dry tile followed by its watered twin. The watering can turns a waterable tile into the next number (dry soil into watered soil). Each night, updateGroundObjectsOvernight reads a flag byte per tile: a watered stage moves on to the next stage's dry tile, watered soil and a watered ripe crop go back to dry, and a dry stage stays where it is. So a crop grows one stage per watered day and a dry day doesn't count. Worked out from the table (computed), the watered days from sowing to ripe are: turnip 4, potato 6, strawberry 6, moondrop flower 6, cabbage 7, eggplant 7, pink cat mint 8, tomato 9, corn 13. Grass's stages aren't waterable and advance every night: 9 nights from seed.Codeharvestwhisperer/hm64-decomp
    How we know
    236    u8 playerInteractionFlags;
    
    src/game/groundObjects.h lines 231–237 at 9824b88 · upstream ↗
    47    { 0x07, 0x00, 0x00, GROUND_OBJECT_TILLABLE, 0x09 },
    ⋮
    49    { 0x07, 0x00, 0x00, GROUND_OBJECT_TILLABLE, 0x09 },
    
    src/game/groundObjects.c lines 46–56 at 9824b88 · upstream ↗
    1242                    currentGroundObject++;
    
    src/game/groundObjects.c lines 1236–1251 at 9824b88 · upstream ↗
    3096                temp2 = currentGroundObjectIndex + 1;
    
    src/game/items.c lines 3089–3099 at 9824b88 · upstream ↗
    171    { 0x06, 0x00, 0x00, GROUND_OBJECT_TILLABLE, 0x09 },
    172    { 0x06, 0x00, 0x00, GROUND_OBJECT_TILLABLE, 0x09 },
    173    { 0x06, 0x00, 0x00, GROUND_OBJECT_TILLABLE, 0x09 },
    
    src/game/groundObjects.c lines 171–181 at 9824b88 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-22.

    Checked by a second AI model, 2026-10-22.

    In the claim ledger

  2. ^In the US release, each night the new day's weather is set before the crops update; then, if it is rain, updateCropsIfRain turns every waterable tile on the farm into its watered twin, as the watering can would, so a rainy day counts as watered. The greenhouse isn't touched.Codeharvestwhisperer/hm64-decomp
    How we know
    691    gWeather = gForecast;
    
    src/game/transition.c lines 691–703 at 9824b88 · upstream ↗
    1473                        setFieldTile(FARM, groundObjectIndex + 1, j, i);
    
    src/game/groundObjects.c lines 1451–1476 at 9824b88 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-22.

    Checked by a second AI model, 2026-10-22.

    In the claim ledger

  3. ^In the US release, the farm's overnight update has a rule for the night that starts a season (the day of the month is 1 by then). Summer turns sprouted-or-older turnips, potatoes, and cabbages into dead plants and their seed stages back into tilled soil. Autumn does the same to tomatoes, corn, moondrop flowers, and pink cat mint, and sends any spring seed stages to tilled soil. Winter clears dry tilled soil, weeds, eggplants at every stage, the dead plants, and the remaining seed stages to the bare tile. Spring turns grass back to cut grass and returns tilled soil to the bare tile when getRandomNumberInRange(0, 5) >= 3. Strawberries, whose seeds sow only in the greenhouse, appear in none of the lists, and the greenhouse loop has no season rule.Codeharvestwhisperer/hm64-decomp
    How we know
    1292                                case TURNIP_SPROUT_STAGE_1 ... TURNIP_RIPE_WATERED:
    
    src/game/groundObjects.c lines 1253–1300 at 9824b88 · upstream ↗
    1321                                case TOMATO_SPROUT_STAGE_1 ... TOMATO_RIPE_WATERED:
    
    src/game/groundObjects.c lines 1306–1338 at 9824b88 · upstream ↗
    1350                                case POTATO_DEAD ... EGGPLANT_RIPE_WATERED:
    
    src/game/groundObjects.c lines 1342–1366 at 9824b88 · upstream ↗
    1384    // greenhouse
    1385    for (i = 0; i < FIELD_HEIGHT; i++) {
    ⋮
    1389            currentGroundObject = greenhouseFieldTiles[i][j];
    ⋮
    1409                 greenhouseFieldTiles[i][j] = currentGroundObject;
    
    src/game/groundObjects.c lines 1384–1409 at 9824b88 · upstream ↗
    3486        groundObjectIndex = (gBaseMapIndex == GREENHOUSE) ? STRAWBERRY_PLANTED_STAGE_1 : INVALID_GROUND_OBJECT;
    
    src/game/items.c line 3486 at 9824b88 · upstream ↗
    700    updateGroundObjectsOvernight();
    
    src/game/transition.c line 700 at 9824b88 · upstream ↗
    2541        setClockNewDay(); 
    
    src/game/game.c lines 2541–2545 at 9824b88 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-22.

    Checked by a second AI model, 2026-10-22.

    Checked by a second AI model, 2026-10-25.

    In the claim ledger

  4. ^In the US release, toolToFatigueScore gives each tool a stamina cost per charge level: the sickle and hoe 2, 4, and 6; the ax and hammer 1, 2, and 3; the watering can 1, 2, and 6; the milker, bell, brush, clippers, the seed bags, and grass seeds 1; the rest 0. Releasing B subtracts the cost from stamina. If it is raining or snowing, or the hour is before 6:00 or from 18:00, and the player isn't in the greenhouse, the same cost is added to fatigue (out of 100), or half of it once a life-event flag the decompilers name KAPPA_POWER_NUT_GIFT is set. Holding B raises the charge level each time a hold counter reaches 16, up to the tool's upgrade level, while stamina covers the next level's cost.Codeharvestwhisperer/hm64-decomp
    How we know
    291    { 2, 4, 6 },
    292    { 2, 4, 6 },
    
    src/game/player.c lines 289–318 at 9824b88 · upstream ↗
    61#define WATERING_CAN 5
    
    src/game/items.h lines 57–85 at 9824b88 · upstream ↗
    1635                if (((SUNNY < gWeather && gWeather < 4) || !(5 < gHour && gHour < 18)) && gBaseMapIndex != GREENHOUSE) {
    
    src/game/player.c lines 1629–1660 at 9824b88 · upstream ↗
    8#define SNOW 3
    
    src/game/weather.h lines 6–8 at 9824b88 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-22.

    Checked by a second AI model, 2026-10-22.

    In the claim ledger

  5. ^In the US release, going to bed refills stamina to its maximum and, unless fatigue is at 100, takes 2 points of fatigue off for each hour of sleep before 6:00, 3 with the cushion (life event HAVE_CUSHION): the hour taken is the bedtime, plus 24 if before 6:00, subtracted from 30. Staying up until 6:00 runs the next day's update by another path that doesn't touch stamina or fatigue. Food and drink add the item's stamina value and take off its fatigue value.Codeharvestwhisperer/hm64-decomp
    How we know
    2531                gPlayer.fatigueCounter += adjustValue(gPlayer.fatigueCounter, -((30 - tempTime) * 2), 100);
    
    src/game/game.c lines 2520–2543 at 9824b88 · upstream ↗
    3254                    handleExitLevel(8, END_OF_DAY_1);    
    
    src/game/player.c lines 3252–3254 at 9824b88 · upstream ↗
    61            handleExitLevel(1, END_OF_DAY_2);
    
    src/game/time.c lines 56–61 at 9824b88 · upstream ↗
    2600        startNewDay();
    
    src/game/game.c lines 2559–2610 at 9824b88 · upstream ↗
    1791            gPlayer.currentStamina += adjustValue(gPlayer.currentStamina, getItemStaminaIncreaseValue(gPlayer.heldItem), gMaximumStamina);
    
    src/game/player.c lines 1788–1793 at 9824b88 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-22.

    Checked by a second AI model, 2026-10-22.

    In the claim ledger

  6. ^In the US release, a cow's milk size comes from its affection (0 to 255): small at 150 or less, medium from 151 to 220, large from 221, and golden for a cow whose milkType is 0, whatever its affection.Codeharvestwhisperer/hm64-decomp
    How we know
    428        if (gFarmAnimals[animalIndex].affection >= 221) {
    
    src/game/animals.c lines 410–434 at 9824b88 · upstream ↗
    19#define MAX_AFFECTION 255
    
    src/game/game.h line 19 at 9824b88 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-22.

    Checked by a second AI model, 2026-10-22.

    In the claim ledger

  7. ^In the US release, adjustFarmAnimalAffection scales a change by an adult cow's condition: a happy cow's gains are doubled and a mad or sick cow's halved. Its loss branch negates the scaled amount, -(amount * 2) for mad and sick and -(amount / 2) for happy, and since the amount is already negative, the result is positive: a loss raises a mad, sick, or happy cow's affection, by twice or half the loss (computed). Leaving an adult cow outdoors on a rainy day can trigger this: updateFarmStatusRain makes it mad when getRandomNumberInRange(0, 3) returns 0 and then applies −20, or sick when getRandomNumberInRange(0, 7) returns 0 and then applies −30, and a cow already sick gets −20.Codeharvestwhisperer/hm64-decomp
    How we know
    353                        adjusted = (amount >= 0) ? (amount / 2) : -(amount * 2);
    ⋮
    361                        adjusted = (amount >= 0) ? (amount / 2) : -(amount * 2);
    
    src/game/animals.c lines 344–362 at 9824b88 · upstream ↗
    402        gFarmAnimals[animalIndex].affection += adjustValue(gFarmAnimals[animalIndex].affection, adjusted, MAX_AFFECTION);
    
    src/game/animals.c line 402 at 9824b88 · upstream ↗
    275                gFarmAnimals[index].condition = condition;
    
    src/game/animals.c lines 238–276 at 9824b88 · upstream ↗
    322                                setAnimalState(2, i, 0xFF, COW_MAD, 0);
    
    src/game/gameStatus.c lines 298–342 at 9824b88 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-22.

    Checked by a second AI model, 2026-10-22.

    In the claim ledger

Sources

Code