Play it in your browser, no download needed: play.sealduel.com. Or get the iPhone app on the App Store.

Thirteen karate animals at the night temple

The idea

Three Seals is a small card duel. Each card has an element and a number: fire burns wood, wood soaks up water, water puts out fire, and if the elements match the higher number wins. Every card you win goes on your shelf as a seal. Three seals of one element, or one of each element in three different colours, and the duel is yours.

$$\text{fire} \succ \text{wood} \succ \text{water} \succ \text{fire}$$

$$\boxed{\text{3 seals, one element, 3 colours}} \quad \text{or} \quad \boxed{\text{fire} + \text{wood} + \text{water}, \text{ 3 colours}}$$

Know the cycle

It is fought by karate animals in a temple at night. You bow in, the gate closes, the clock runs, and at the end both fighters bow and say "Oss!". I wanted a game you can play in two minutes on the bus, but one that still feels like a proper dojo.

What it does

  • Three masters with their own habits. Peanut is a hasty apprentice, Tosby is patient, and Huma reads your habits and plays against them. After the black belt come the shadow masters, and that ladder never ends.
  • Belts you earn. White to black, then dan ranks. Losing never takes points away, and win streaks give a bonus. Your belt colour shows on your character.
  • Three special moves: Peek, Redraw and Power. The clock is short, so if you hesitate the master picks a card for you.
  • A scene for every clash: flamethrowers, tsunamis, earthquake cracks, wood sprouting through the floor.
  • 13 animal avatars and a wardrobe. You can change the gi, headband, hand wrap and card back, in plain colours or patterns (leopard, zebra, tartan, sakura and more).
  • A daily duel, a Seal Path and monthly events. The first event, Crimson Leaves, starts on 6 October.
  • Game Center leaderboards and achievements, iCloud progress, and 11 languages.
  • Works offline. No ads and no account.

Take three seals before the master does

Monetisation (RevenueCat)

The whole game is free. There is no hard paywall and no trial wall. You pay for how you look, never for how strong you are. Belts, masters and card power are never for sale.

  • Dojo Membership (£3.99 a month or £29.99 a year): member-only outfits, marked with the gold Dojo Member badge, plus 150 tokens every month.
  • Dojo Tokens (100 / 550 / 1200 / 2500, from £0.99 to £19.99): spend them on single outfit items and event sets in the wardrobe. You also earn tokens by playing: 3 for a win, 1 for a loss.

Dojo Membership and Dojo Tokens

Everything runs through RevenueCat. The app uses @revenuecat/purchases-capacitor. The member entitlement unlocks the member items. The default offering holds the monthly and yearly packages and drives the membership sheet, and a second tokens offering drives the token shop. Token purchases are credited from RevenueCat's non-subscription transactions, keyed by transaction id. Progress also syncs through iCloud, so this keeps a pack from being credited twice when two devices merge. The products and offerings are set up by script through the App Store Connect API and the RevenueCat v2 API, so I can rebuild the whole setup from nothing.

Merch and monthly drops

The dojo also lives outside the game. At shop.threeseal.com there is a small shop: a cap, a tee, a hoodie, an AirPods case and a sticker sheet, all made from the game's own art. Everything is made to order in the UK, with free UK delivery. For now it posts to UK addresses only.

It runs like a streetwear drop. Every month the game has an event, and that month's event becomes an embroidered patch: Harvest Moon in September, Crimson Leaves in October. A new one every month, and when the month ends it is gone. Next comes a Dojo Member patch, so the membership you hold in the game is something you can wear.

A new drop every month

How I built it

The game is one HTML and JavaScript file with no framework and no engine. The characters are hand-built SVG rigs, and the scenes are drawn on a canvas. A small build script puts the modules together, and Capacitor wraps the result as the iOS app. I wrote small native plugins in Swift for Game Center, iCloud key-value storage and the App Store rating prompt.

Every run of a duel is seeded, so the same seed plays the same match. Nothing in the game uses Math.random. This means a headless test can play whole matches, and it will later let two players replay the same duel online. The flow tests (124 checks) and an autoplay test run before every release.

Store assets are scripted too, plus a 30 second preview video for each language:

$$11 \text{ languages} \times 6 \text{ screenshots} \times 3 \text{ device sizes} = 198$$ Amplitude handles product analytics, through a small fetch client with no SDK.

What was hard

  • Players didn't understand how to win. In early tests people didn't know what the dots on their shelf meant. I turned them into element tiles with empty slots for the seals still missing. At the end of the first few duels, the three winning tiles now light up one by one before the bow.
  • Battery and heat. Ten minutes of play was using about 10% of the battery. Measuring in a real WKWebView showed the cause wasn't the drawing: it was endless SVG animations on the character rigs. I moved the idle sway into cheaper layers and slowed the world down during a duel. No single fix did it; the gain came when all of them calmed down together.
  • The "Oss!" sound. No free sound library had one, so it's my own voice. The master's call is a second, cleaner recording with a bit of dojo echo.

What I learned

The game itself was the easy part. The hard part was making a new player understand in thirty seconds why they won, and giving them a reason to come back tomorrow (the daily duel, the belt, the next master). Most of my time went there.

What's next

Online duels using the same seeded engine, the Android version with RevenueCat on Google Play (the first build is already in review there), and members-only game modes such as the shadow-master run.

Built With

Share this project:

Updates

Submission history