0

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: plain JavaScript ES modules, no framework: a static client, 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 03:30 UTC (30 min after posting). 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. Can't make it? 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?

Play: https://bronzeandglory.fun/?ref=r35-js-lemmyml

1

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 03:30 UTC (30 min after posting). 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. Can't make it? 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?

Play: https://bronzeandglory.fun/?ref=r35-prog-sopuli

0
submitted 2 days ago* (last edited 1 day ago) by BronzeAndGlory_Dev@on200.com to c/programming@programming.dev

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

3
submitted 2 days ago* (last edited 1 day ago) by BronzeAndGlory_Dev@on200.com to c/webdev@programming.dev

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

0

I'm the solo developer of Bronze & Glory, a free turn-based gladiator game that runs in the browser on desktop or phone.

12 seconds of a real campaign bout

Every attack shows its hit chance, damage and energy cost before you commit, and your opponent telegraphs its next move. Four classes, a 100-opponent campaign, and online duels against real people with a free account. Nothing to download, and Quick play needs no sign-up, so the link drops you straight into a bout.

The hard part of a small multiplayer game is that the online queue is empty when you arrive alone. So if you try it, try it now and send the link to one friend so you can duel each other. If nobody else is searching, a clearly labelled Practice Bot steps in instead of leaving you waiting.

Play: https://bronzeandglory.fun/?ref=r33-playmygame-pd

What I'd most like feedback on: did your first bout make sense without reading anything, and what (if anything) would make you play a second one? I'll answer every reply, and I'm happy to play and give feedback on games others post here too.

[-] BronzeAndGlory_Dev@on200.com 1 points 3 days ago

Thanks, that means a lot - I'm the dev. There's an Arena Hour every day 19:00-20:00 UTC and a bigger Arena Night II on Sat 24 Oct, 19:00-21:00 UTC, if you want company in the arena. Anything that felt rough or confusing in your first bouts? https://bronzeandglory.fun/?ref=r25-gamedev-reply

-4

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?

3

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 account, 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, so each bout is a small puzzle about range and energy rather than luck. There are four classes (Sentinel, Duelist, Berserker, Arcanist) and a 100-opponent campaign. Online duels against real players need a free account.

Play: https://bronzeandglory.fun/?ref=r20-ah-webgames

Arena Hour, today 19:00–20:00 UTC (and every day until 26 Oct): live online matches. If nobody else is searching, a clearly labelled Practice Bot joins so you aren't left waiting. Arena Night II: Sat 24 Oct, 19:00–21:00 UTC (15:00 EDT, 20:00 BST, 21:00 CEST).

The home screen also shows the Arena Hour time in your local time, with an "Add to my calendar" button.

What would make you play a second bout? I'm reading every reply.

BronzeAndGlory_Dev

0 post score
0 comment score
joined 4 days ago