Magical Ferry

A ferry-crossing puzzle game based on the classic riddle, set in a magical forest.

PLAY MAGICAL FERRY

The wolf, the sheep, and the cabbage

I got my love of puzzles from my grandmother. When we first immigrated to the U.S., instead of watching TV we didn't understand or hanging out with neighbors who closed their doors, my grandma would entertain me with all sorts of riddles and puzzles. My favorite was the wolf, the sheep, and the cabbage. A shepherd has to transport them across a river, holding one at a time, without any of them eating each other.

When Opus first launched, I decided to turn the riddle into a full-on game.

web
mobile

Gameplay

A player can solve the same riddle only so many times before getting bored. The magical forest setting was ripe for all kinds of jinxes and shenanigans. Every few levels, I introduce a new mechanism:

Level 10 requires careful balancing of weights.

Curses, werewolves, mimics, and ghosts

The last 5 levels were the hardest but most rewarding to build. By this point, players are masters at balancing weights, handling feuding passengers and their fickle statuses, and even juggling cursed objects! The only part of the gameplay that hadn't changed was the map. What if we added another area?

Welcome, Atlantis: the secret island that only revealed itself during low tide. Players could use it to temporarily park a passenger or an item until high tide. Cool, huh?

But that required giving players a reason to use the island. So I added these lovely passengers:

The Mimic card under a speech bubble reading: I copy the statuses and rules of a random passenger nearby.
The Villager card and the Werewolf card side by side under one speech bubble reading: I turn into something nasty every 3 turns. You don't want to be near me.
The Curse card under a speech bubble reading: I curse anyone near me. Anyone cursed for more than 3 turns will suffer horribly.

Daily challenges and social gamification

Inspired by Wordle and the NYTimes Mini Crossword, I wanted a way for people to compete with their friends. I built an automation that generates a new level every day, getting harder later in the week. Players who successfully complete the level see their score on the global leaderboard, gain badges, increase their streak, and easily share their scores with their friends.

daysetupoptimal
Monday5 creatures, conflicts only3 to 5 trips
Wednesday+ luggage, bonded and repelling7 to 9
Friday+ separation rules, 7 creatures11 to 13
Sundayeverything, tighter weight cap, 8 creatures15 to 25
The daily result screen: a leaderboard of ten players ranked by time with their mistake counts, new personal records, a day streak, and two badges earned
Global leaderboard for completing the daily challenge
The story badge grid: 25 tiles with pixel icons, some earned and some still locked
Badges earned for daily challenge and main story

Many early playtesters loved this aspect of the game, noting how low-stakes and casual it was compared to the main game, which required a lot more time and skill. The one-click share sheet was a seamless way to spark interest, FOMO, or mad competition in any group chat.

Magical Ferry - Daily Challenge (Tuesday - Easy):
🚢 5 rides (optimal)
🔄 0 retries
⌛ 0:11
💡 Hints used: 0
👁 Solution viewed: No

UI and animations

All of the UI was made by sketching a draft on Figma or Procreate and feeding it to Claude. I bought a pixel art pack for the tiles and characters. The animations came from various JS libraries. Overall, I spent a month of nights and weekends iterating, generating unique levels, and polishing the art and delight factor of the game.

beforeAn early build where the two river banks are flat green rectangles
afterThe shipped build with pixel-art tiled banks, grass detail and rocks

The puzzle engine

Each level had to have only one optimal solution (the one requiring the fewest rides/turns). If a level had 7+ passengers and objects, each with their own statuses and rules, then millions of combinations of rides could exist. I had to build a game engine robust enough to calculate which one of these millions of combinations could be the solution, if there was one at all. Add weights, curses, and ANOTHER island on top, and things could get quite unwieldy.

Doctor Strange looking through millions of possible futures

After a few runs, I noticed the engine chose a few "dumb" solutions:

With each level, I'd apply stricter rules to prevent the engine from choosing these suboptimal solutions. Eventually, if the engine could not find one, I'd have to create the solution myself.

Finally… the launch!

I launched this game at the end of July to a few gaming Discords and subreddits. I didn't spend anything on ads, and I don't intend to monetize it (the moral grey area of profiting off AI is a topic for later…). I just wanted to make Granny proud and build a puzzle game that I would personally love to play! All that said, I was quite surprised to see that this game has 300+ unique players so far! The retention rate is much less desirable, but hey, not bad for my first game!

An analytics panel showing 324 daily active users, up 1,017.2 percent, and 6 percent day-one retention