Pactwarden
In developmentA 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.
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.
Mitchel van Emmerik