NL EN
Projects

Pactwarden

In development

A real-time multiplayer auto-battler in pixel art: as a summoner you call creatures into three lanes, and they fight on their own until they reach the enemy ward. 1v1 or 2v2, with bots.

Period
2026, in development
Role
Design and development
Built with
TypeScriptNode.jsWebSocketCanvasVite

Alpha screenshots: the game is still in development, so graphics and balance may change.

  • 20ticks per second, simulated on the server
  • 8creatures, each with its own role
  • 4players per match, topped up with bots
  • 30 sto come back after a dropped connection

About the project

Pactwarden is a real-time multiplayer auto-battler you play in the browser. You are a summoner: your mana fills up over time and you spend it to summon creatures into one of three lanes. They walk forward and fight on their own; when they reach the enemy's ward, they strike the summoners behind it.

A team wins when every enemy summoner has fallen. After six minutes, the team with the most HP left wins. You play 1v1 or 2v2, and bots fill empty seats.

What I built

  • A lobby with every open game, updated live; join with a click or with the arrow keys and Enter
  • A room with two teams, Dawn and Dusk: switch seats, mark yourself ready, chat, and add bots as the host
  • Eight creatures with their own roles: swarms, flyers, tanks, ranged support and a colossus that marches straight at the ward
  • A bestiary with the stats, traits and a tip for every creature, plus a matchup chart
  • Reconnect within 30 seconds after a reload or a dropped connection; a bot steers your summoner meanwhile
  • A results screen with the creatures summoned, damage dealt and HP left for every summoner

How it works

The server decides

The simulation runs on the server, twenty times a second, and sends compact snapshots to the players. The client draws slightly behind the latest snapshot and interpolates between them, so everything moves smoothly, even when a packet arrives a little late.

A matchup chart that works itself out

Who beats whom isn't filled in by hand: a script plays every pair of creatures against each other at equal mana in the real simulation and writes down the result. A test fails when the chart no longer matches the stats, so it is recomputed after every balance change.

Nothing from a CDN

A script packs the sprites into one atlas, all sound is synthesised in the browser with WebAudio and the fonts are self-hosted. The game loads nothing from outside.

One container

A multi-stage Docker build runs the tests and stops on a failure. The final image holds only Node and the bundle, runs as an unprivileged user and has a health check. HTTP and the WebSocket share one port, so one host is enough behind a reverse proxy.