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.
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 1: Regular game. Some passengers will eat/jinx/kill each other if left alone.
- Level 5: Statuses. Some passengers get seasick if they ride more than once. Others will panic if left completely alone.
- Level 8: Luggage. You must now also transport luggage. However, some items curse passengers, while others cannot ride apart from their owners.
- Level 10: Weight. Each ride cannot exceed a maximum weight.
- Level 17: Tides. Every few turns, the water level drops to low tide, revealing a secret island that you can park passengers and items on. However, once high tide comes around, anything left on the island will drown.
- Level 20: Fog of War. The fog moves from one side of the river to the other, hiding the passengers' statuses, rules, and relationships with each other, effectively turning it into a memory game.
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:
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.
| day | setup | optimal |
|---|---|---|
| Monday | 5 creatures, conflicts only | 3 to 5 trips |
| Wednesday | + luggage, bonded and repelling | 7 to 9 |
| Friday | + separation rules, 7 creatures | 11 to 13 |
| Sunday | everything, tighter weight cap, 8 creatures | 15 to 25 |
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.


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.
After a few runs, I noticed the engine chose a few "dumb" solutions:
- Solutions in which the same move is repeated multiple times or the same passengers are shuffled back and forth
- Solutions for levels with the hidden island that could be solved without ever using it
- Solutions for levels with weight limits in which passenger weights never add up to exceed the limit
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!