# Fishing in Lantern Valley: a minigame where nothing is lost

> How the fishing of Lantern Valley is designed: a forgiving cast-wait-pull loop, twelve fish with places and hours, and rules that are pure and tested.

Canonical page: https://andersonmancini.dev/blog/lantern-valley-fishing

Published: 2026-10-12 · 3 min read · Tags: game-dev, game-design, three.js, cozy-game

Fishing is the first thing a cozy game is expected to have. A fishing minigame is usually a test: a bar, a window, a reaction time, and a fish that escapes if you are slow. For a game about small, calm moments, that is the opposite of the right idea.

In [Lantern Valley](https://andersonmancini.dev/blog/lantern-valley.md) fishing was the first new verb after the core of the game, and it became the template for the others: planting, caring for animals and cooking. This post is about how it is designed.

![Tina fishing from a pier at dusk](https://andersonmancini.dev/blog/lantern-fishing/cover.webp)

## The loop

1. Sailor Tito lends you a rod, and it is already in your hand.
2. At the end of a pier, or in front of any deep water, a prompt says **Fish**. Press **E** and the line is cast.
3. The bobber lands with rings on the water. The character waits. One or two small nibbles say that something is interested.
4. When the bobber sinks, a **!** appears and the prompt says **Pull!** Press **E** again.
5. The fish makes an arc over the head, the character lifts it, and a card shows the name, the size and "new!" or "record!".

The window for the pull is generous, 1.5 seconds, and **every miss gives you a second chance with a wider window**. The fish only takes the bait and comes back. Walking, jumping or swinging the sword reels the line in at no cost.

## Nothing is lost, and the first fish is a gift

The first fish arrives fast, in 2.4 seconds, and it is guaranteed. The first three are never rare. The lesson does not depend on luck: a player who has never fished before should have a fish in their hands before they can doubt the idea.

That is a rule I applied everywhere in the game. Cozy does not mean there is no challenge. It means that a mistake never costs the player something they cared about.

## Twelve fish, and a table of who bites when

There are twelve fish, each with a place, an hour, a rarity and a size: a minnow, a golden carp that "swallowed a little piece of the sunset", a lavender trout from the waterfall, a whisker catfish that only comes out at night, a lantern fish, a moonfish that only rises when the moon is watching the lighthouse, a silver eel that waits for rain, a sea bunny and The Golden Boot, which appears one time in two hundred. Nobody knows whose it is.

Each water has a kind: pier, bay, lake, river, river mouth, waterfall foot or sea. At the moment you cast, the game works out who can bite from three things: **where** you are, **what hour** it is and **what weather**. Then it picks one with the game's own random number generator, and that generator is saved. Reloading the game does not re-roll the day.

## Rarity is felt, not shown

A rare and a legendary fish are different from a common one in sound, in glow, in how close the camera comes and in a small shake. The reel is faster the rarer the fish.

## How it is built

The rules of the line are a **pure module**, with no graphics, and it has tests. It is a small state machine: cast, wait, nibble, hook, pull, catch. All the timings are in one `TUNING` table at the top of the file, so changing the feel of fishing is editing a number.

Everything around it is separate: a system that puts the rules in the world with the prompt, the poses, the camera and the sounds, a table of fish as data, and a codex that remembers each species you caught, its biggest size and where. The codex is saved with the game and is reused by the other collections.

The dialogue of Sailor Tito, and the quest that follows, are also data: rules of the form "when this, say this lines, then that". Adding a fish is one entry in a table and one name in the translation file. Adding a fishing spot on a new island is one more water kind.

## What I left for later

I wrote down what was not done, so I would not forget it: slow motion and a micro-pause for the rare and legendary catches, which need the world's clock to be scalable, rain and the phase of the moon for the fish that wait for them, fishing from the boat and diving. Fishing worked without them, and a list of what is missing is a better companion to a game than a list of what is finished.

You can try it at [lanternvalley.vercel.app](https://lanternvalley.vercel.app/).

## Related projects

- [Lantern Valley](https://andersonmancini.dev/projects/lantern-valley.md) — Cozy adventure game for the browser
