DEV Community

Zach Forbes
Zach Forbes

Posted on AI-assisted

Sin of Angels (SOA Game): The Digital Board Game that Plays like Sons of Anarchy

Sin of Angels, the SOA game from CRIME Digital, is a browser based outlaw motorcycle club strategy board game, built for players hunting for games like the out-of-print Sons of Anarchy: Men of Mayhem board game. Same DNA: rival clubs, area control over a gritty map, running guns, cutting deals and betraying them, and settling it in a fight. Sin of Angels is its own original game, with cinematic 3D brawls and a party mode you can throw on the TV. Two to six players, no install, on desktop, tablet or phone.

Sin of Angels is an independent game and is not affiliated with, sponsored by, endorsed by, or associated with FX, 20th Television, The Walt Disney Company, or the publishers of Sons of Anarchy or Sons of Anarchy: Men of Mayhem. All trademarks are the property of their respective owners.

This post is about the hardest thing in it to build.

We built Sin of Angels, a turn based strategy board game that runs entirely in a browser. Two to six players, no install, on desktop, tablet or phone.

It has a mode we call party mode: the 3D board renders on a TV, and every player acts privately from their own phone. That one sentence turned out to be the hardest thing in the project, and the reason is not rendering. It is state authority.

The problem is not "two screens"

Plenty of games do second-screen. The usual shape is that each client holds the game state and the server referees. That falls apart the moment one of your clients is a television in a room full of people.

The TV needs enough state to draw the board: who holds which Site, whose turn it is, what the round is. It must never hold anything private, because "the TV knows it but does not draw it" is one bug away from "the TV drew it". With six people staring at the same screen, that bug is not recoverable. Somebody saw it.

So the split cannot live in the view layer. It has to live where state is served.

One authoritative public projection, N private ones

What we ended up with is a single source of truth on the server that produces distinct projections per connected client:

  • the public projection for the TV: board topology, control, turn order, resolved outcomes
  • a private projection per player: their own hand, their stash, their sealed bids

A client cannot ask for a projection it is not entitled to. The TV client literally has no code path that receives private fields, which means a rendering mistake cannot leak them, because the data was never in the browser.

This is more annoying to write than "send everything, hide some of it in the UI". It is also the only version we were willing to ship.

Resolve first, animate second

The second thing that fell out of this: animation must never be authoritative.

When two clubs land on the same Site it triggers a Brawl. Players call for Backup, commit Guns, and roll dice, and it plays out as a cinematic 3D fight rather than a card flip.

The outcome is computed and committed before any animation starts. What everyone watches is a replay of a decision that is already made.

That sounds like a small ordering detail. It is what makes the mode survive reality:

  • a slow phone that drops half the frames still shows the correct result
  • a player who reconnects mid fight resyncs to a settled outcome, not a race
  • the TV and six phones cannot disagree about who won, because none of them decided it

If you let the animation drive the result, every one of those becomes a desync bug you will be chasing forever.

A design note that is really an engineering note

The win condition is the most Cash after round six. Territory is how you earn that Cash, it is not the win condition by itself.

That started as a design decision to stop the final round collapsing into a land grab. It had a side effect we did not plan: it made ties genuinely likely, because Cash is a number two clubs can land on together. So the tiebreak could not be an afterthought bolted on at scoring time. It had to be a first class piece of state that players compete for all game, which is the Envelope, and which also sets turn order.

Scoring rules and state design are the same problem wearing different hats. We found that out late.

Where it is

Sin of Angels is in closed beta and not publicly playable yet. The beta is free to play; the finished game will be paid, with a single purchase planned to cover browser, Steam and Android together. Beta testers get in before release and their bug reports shape the finished game. You can request a seat at soa-game.com.

Happy to go deeper on the projection model in the comments if anyone is solving something similar.

Top comments (0)