Harvest Moon 64
A 1999 farming game for the Nintendo 64, read through harvestwhisperer's matching decompilation of the US release.
On this page
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
| Mechanic | Kind | How |
|---|---|---|
| Crop growth | Watered days | a 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 |
| Calendar | Seasons | four seasons of 30 days, each day turning over at 6:00 |
| Time of day | Game clock | 10 game seconds per loop step on maps where time flows, at most 10 game minutes per real second |
| Stamina | Daily | each 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 |
| Affection | Points | a 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)
References
- ^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,updateGroundObjectsOvernightreads 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-decompHow 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 US release, each night the new day's weather is set before the crops update; then, if it is rain,
updateCropsIfRainturns 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-decompHow 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 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-decompHow 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 US release,
toolToFatigueScoregives 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 nameKAPPA_POWER_NUT_GIFTis 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-decompHow we know
291 { 2, 4, 6 }, 292 { 2, 4, 6 },
src/game/player.c lines 289–318 at 9824b88 · upstream ↗ 61#define WATERING_CAN 5src/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 3src/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 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-decompHow 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 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
milkTypeis 0, whatever its affection.Codeharvestwhisperer/hm64-decompHow we know
428 if (gFarmAnimals[animalIndex].affection >= 221) {src/game/animals.c lines 410–434 at 9824b88 · upstream ↗ 19#define MAX_AFFECTION 255src/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 US release,
adjustFarmAnimalAffectionscales 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:updateFarmStatusRainmakes it mad whengetRandomNumberInRange(0, 3)returns 0 and then applies −20, or sick whengetRandomNumberInRange(0, 7)returns 0 and then applies −30, and a cow already sick gets −20.Codeharvestwhisperer/hm64-decompHow 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.
Sources
Code
- harvestwhisperer and hm64-decomp contributors. 2026. “hm64-decomp: a decompilation of Harvest Moon 64 (harvestwhisperer/hm64-decomp).” Commit 9824b88. harvestwhisperer/hm64-decomp @ 9824b88 · licence, all uses