Disclosure: I'm the solo developer of Bronze & Glory, a free turn-based gladiator duel game in the browser. No ads, no download, no payments.

12 seconds of a real campaign bout

Stack: a static client in plain JavaScript ES modules, served by nginx. The game server is Node with SQLite. A separate small Node service counts players online from page heartbeats.

How the multiplayer sync works: there are no WebSockets. A duel is a server-side room; each client polls the room over HTTP and submits its move. The server runs the same rules engine module as the client (takeDuelTurn), so a client can't fake a result. Because it is turn-based, polling latency is hidden in the turn animation. Per-user rate limits (e.g. 60 moves/min per user) keep a misbehaving tab from flooding the server.

The empty-queue problem: a small game's online queue is empty most of the time. If nobody else is searching after a few seconds, a clearly labelled Practice Bot takes the seat (the server can also seat a ghost after 8 s). It is never counted as a player.

What I'd love feedback on: is HTTP polling a mistake at this scale, and where would you move to WebSockets/SSE?

Help me load-test the live server. Join now; group match at 01:20 UTC (30 minutes after posting). Can we get 4+ into one arena? Open the link, go to online duels (a free account: pick a username and password) and search for a quick match: you get paired with whoever else is searching.

Play: https://bronzeandglory.fun/?ref=r34-programming-pd

Update: Load test #2 is Sun 25 Oct 19:00 UTC (15:00 EDT / 12:00 PDT / 20:00 CET): can we get 25 into one arena? https://bronzeandglory.fun/?ref=r35-return-programming-pd

 

Disclosure: I'm the solo developer of Bronze & Glory, a free turn-based gladiator duel game in the browser. No ads, no download, no payments.

12 seconds of a real campaign bout

Stack: a static client in plain JavaScript ES modules, served by nginx. The game server is Node with SQLite. A separate small Node service counts players online from page heartbeats.

How the multiplayer sync works: there are no WebSockets. A duel is a server-side room; each client polls the room over HTTP and submits its move. The server runs the same rules engine module as the client (takeDuelTurn), so a client can't fake a result. Because it is turn-based, polling latency is hidden in the turn animation. Per-user rate limits (e.g. 60 moves/min per user) keep a misbehaving tab from flooding the server.

The empty-queue problem: a small game's online queue is empty most of the time. If nobody else is searching after a few seconds, a clearly labelled Practice Bot takes the seat (the server can also seat a ghost after 8 s). It is never counted as a player.

What I'd love feedback on: is HTTP polling a mistake at this scale, and where would you move to WebSockets/SSE?

Help me load-test the live server. Join now; group match at 01:20 UTC (30 minutes after posting). Can we get 4+ into one arena? Open the link, go to online duels (a free account: pick a username and password) and search for a quick match: you get paired with whoever else is searching.

Play: https://bronzeandglory.fun/?ref=r34-webdev-pd

Update: Load test #2 is Sun 25 Oct 19:00 UTC (15:00 EDT / 12:00 PDT / 20:00 CET): can we get 25 into one arena? https://bronzeandglory.fun/?ref=r35-return-webdev-pd

 

I'm the developer of Bronze & Glory, a free turn-based gladiator game that runs in your browser on desktop or phone. Nothing to download, and Quick play needs no sign-up, so you can start a bout straight away.

Every attack shows its hit chance, damage range and energy cost before you commit, and your opponent telegraphs its next move. There are four classes (Sentinel, Duelist, Berserker, Arcanist), a 100-opponent campaign, and online duels against real players (those need a free account).

The problem with a small online game is that the queue is empty when you show up alone. So I'm trying a fixed slot: Arena Hour, every day 19:00–20:00 UTC (running now, and daily until 26 Oct). Come then and there's a good chance of a live opponent; if no one else is searching, a clearly labelled Practice Bot steps in so you're never left waiting. The home screen shows the time in your local time and has an "Add to my calendar" link: https://bronzeandglory.fun/?src=cal-ah-gamedev

For other devs, the design question behind this: with only a handful of players online, matchmaking has to decide how long to wait for a human before offering a bot. My answer so far is a Practice Bot that is always clearly labelled as a bot, and the fixed daily slot is my attempt to concentrate the few players there are into the same hour instead of spreading them across the day. If you've shipped a small multiplayer game, I'd like to know what you'd do differently (longer queue timeout? scheduled events? async duels?).

The bigger one is Arena Night II: Sat 24 Oct, 19:00–21:00 UTC (15:00 EDT, 20:00 BST, 21:00 CEST), two hours of live duels with whoever turns up.

Play: https://bronzeandglory.fun/?ref=r19-ah-gamedev

I'd love feedback from other devs: what would make you play a second bout?