Fishing in Portugal
Fishing · Unity · C#
- My role Programming and mechanics design
- Team 3 people
- Context One-week game jam
- Engine Unity
- Code GitHub
Play now
Mouse only: move it to raise and lower the hook. Catch what's worth coins, dodge what isn't, and don't let the jellyfish touch the line.
Not loading? Open it directly on itch.io.
The game
You're on a boat off the Portuguese coast. You lower the hook to the depth where the fish you want tends to swim, wait for it to pass, and pull.
Bait is your life: you get three, and every mistake costs one. A boot and a plastic bag are worth nothing and still take one. The cuttlefish dodges the hook once when you get close. And the jellyfish cannot touch you — not the hook, not the line.
When the bait runs out you can buy more at the shop with the coins you caught, and upgrade the boat while you're there. Running out of bait isn't the end: the end is running out of bait and money at the same time.
What was mine
All the programming and the mechanics design. Fish movement, the weighted spawn system, collisions, the coin economy, the shop, boat upgrades, and the data structure that describes each fish.
The other two members did the art and the documentation.
Fish that actually exist
The jam's theme was Portugal. The easy way out would have been to put a flag in a corner. I went through the content instead: every fish in the game is a fish from the Portuguese coast — sardine, horse mackerel, mackerel, meagre, sea bass, white seabream, gilthead bream, cuttlefish.
And it isn't only the names. The depth each one appears at and how much it is worth in coins were anchored to the real animal. The sardine schools near the surface and is worth little; what's worth more lives deeper. The player never reads this anywhere — they learn it by lowering the hook and seeing what swims past.
Each fish is a separate data file, with sprite, speed, depth range, value, spawn weight and behaviour. During the jam, adding a fish meant touching code. Today it means creating a file and dragging it into a list — and that change is the most useful result of the 2026 revision.
The bug that charged you and delivered nothing
A one-week jam leaves things behind. I only found the worst of them when I came back to the project a year later.
The player's bait count didn't exist as a number: it was stored in the colour of the three worm images on screen. Green meant bait, black meant spent bait, and counting bait meant looking at the interface.
It worked while fishing. But on entering the shop, that scene was destroyed and the images with it — while the object holding the bait survived, still pointing at images that no longer existed. Buying bait deducted the coins, tried to paint a dead image, and failed halfway through. The player paid, received nothing, and didn't even see an error, because the line showing the message came after the line that broke.
The fix wasn't a patch: it was separating the two things. Today the bait count is a number, and whatever shows bait on screen subscribes to be notified when it changes. The fishing scene and the shop use the same component, and a scene without a bait bar simply doesn't listen — instead of breaking.
The lesson that stuck: if your state lives inside the interface, it dies with it.
The jellyfish, and the difference between aiming and navigating
The jellyfish art was finished during the jam and never made it in — there wasn't time. Coming back to the project, it became the mechanic that had been missing, and for a reason that only became clear once it was implemented.
Everything else in the game happens at the hook: a collision at a single point. The jellyfish reacts to the whole line, which is a long area that changes size every frame as the player moves up and down.
That changes what the player does. Before, only the final depth mattered: pick a height and wait. With the jellyfish, the path to that height matters too. It's the difference between aiming and navigating — and it required no new system at all, just a collider that was already in the scene, unused.
The visual answer came with it: on contact, the line flashes blue and thickens. Punishing without showing why teaches the player to distrust their own eyes. And the flash belongs to the jellyfish alone, on purpose — if everything flashed, the blue would stop meaning anything.