Edge of battle area
500 750 1000
Difficulty
EasyNormalMediumHard
W/S · forward/back   A/D · turn
Q/E · turret left/right   Space/F · fire
Tab · ammo (AP/HE)   V · gun sight
G · smoke   C · artillery   Esc · pause
About Treads of War is a browser reimplementation of Conqueror (Superior Software, 1988, Acorn Archimedes), one of my favourite childhood games. Over time it grew new features, refinements, and improvements far above and beyond the scope of the original. I claim no credit for copyright for the original work, and this is intended as a compliment and a love letter. Feel free to reach out to me: [email protected]. Thanks! March 2026.
Controls Simple (WASD): W/S forward/back, A/D turn, Q/E turret, Space/F fire, Tab ammo, V sight, G smoke, C artillery, P/Esc pause. Advanced (original): H/N left track fwd/rev, K/M right track fwd/rev.
Arcade Solo mode — survive endless waves. Each 4 kills upgrades your tank class. You have 3 lives. Heavy class (wave 4+) adds one more enemy per wave.
Attrition You start with a fixed squad of 5 tanks — losses are permanent. Enemies escalate each battle. Tab switches your controlled tank. Last squad standing wins.
Strategy Before each battle, spend your budget on any mix of Allied, Soviet and Axis tanks. Enemies buy too. Capture and hold the objective ring for 60 seconds to win the battle. 7 battles total.
Online Multiplayer tank battle against friends — on your local network or over the internet. Enable Online in Settings, then select it from the mode list. Nothing to install on player machines. Server setup is covered in the Server Setup tab.
Network — Playing (Host) Pick your tank on the main menu, then select Online and click Host Game. A 4-character room code appears (e.g. 7K3M) — share it with your opponents by any means (chat, voice, text). Wait for them to join, then click Start.
Network — Playing (Join) Pick your tank, select Online, then click Find games to see open rooms on the server — click one to fill in the code. Or type the code your host gave you directly and click Join. Multiple games can run concurrently; room codes keep them separate.
Network — Notes Ping is shown in the bottom-left HUD (Advanced Info on). Shot effects — muzzle flash, explosions, ricochets — are synchronised to all screens. Your opponents' tank names and HP bars appear above their vehicles. A Rematch button is shown at the end.
Armour Shells are resolved against front / side / rear armour zones. Approach angle determines the zone. A shot that cannot penetrate (firepower < armour × 0.6) ricochets with a gold spark. Aim for flanks and rears of heavy tanks.
Damage Below 50% HP: half speed. Below 25% HP: quarter speed, damage smoke. Below 12% HP: tracks wrecked — hull immobile but turret still operates.
Source Want to run this yourself? The full source for v4.9 (08-03-2026) can be downloaded here (0.2 MB).
Overview Online requires a WebSocket relay service running on your server. The relay is a small Node.js process — no installation is required on player machines. Two connection paths are supported:
  • LAN / HTTP — players connect directly to port 8765 on the server. No proxy config needed.
  • Internet / HTTPS — traffic routes through nginx and your reverse proxy (e.g. NPM). Port 8765 can stay closed to the internet.
1 · Docker Compose Add the relay service to your docker-compose.yml alongside the games nginx service:
  relay:
    build: ./relay
    ports:
      - "8765:8765"
    restart: unless-stopped
The relay/ directory (containing relay-server.js, Dockerfile, and package.json) is included in the project and synced to the server on every ./deploy.sh run. Start it once manually, or let deploy handle it:
docker compose up -d --build relay
2 · Nginx Config The games nginx config (conf/default.conf) must proxy /relay to the relay container. Both the WebSocket connection and the HTTP discovery endpoint route through the same two location blocks:
location = /relay {
    proxy_pass         http://relay:8765;
    proxy_http_version 1.1;
    proxy_set_header   Upgrade    $http_upgrade;
    proxy_set_header   Connection "upgrade";
    proxy_set_header   Host       $host;
    proxy_read_timeout 86400s;
}

location = /relay/discover {
    proxy_pass       http://relay:8765/discover;
    proxy_set_header Host $host;
}
Use the Docker service name relay (not an IP address) — both containers are on the same compose network. Reload nginx after editing:
docker compose exec <nginx-service-name> nginx -s reload
Verify with: curl http://localhost:<port>/relay/discover — should return {"name":"Treads of War Relay","rooms":[]}.
3 · Reverse Proxy (NPM) Required for HTTPS / internet play. In Nginx Proxy Manager, edit the proxy host for your games domain:
  • Go to Proxy Hosts → your games domain → Edit.
  • On the Details tab, enable Websockets Support.
  • Save. No custom location blocks are needed — the inner nginx handles the /relay routing.
Without this toggle, NPM strips the Upgrade header and the WebSocket handshake fails silently.
4 · Firewall
  • LAN play (HTTP): port 8765 must be reachable from other devices on the LAN. Open it in your host firewall (ufw allow 8765/tcp or equivalent).
  • Internet play (HTTPS): port 8765 does not need to be internet-facing. All traffic enters via port 443 through NPM. Port 8765 only needs to be accessible within the Docker network.
  • The games web server port (e.g. 36008) must be reachable by NPM — typically it already is since both run on the same host.
5 · Deploy Script deploy.sh handles everything in one step: it rsyncs src/ to the remote server, rsyncs the relay/ directory, and SSHs in to run docker compose up -d --build relay. Run it from the project root:
./deploy.sh
The relay container is only rebuilt if its source files changed; otherwise it restarts in place (no-op rebuild). No manual steps are needed after initial setup.
Troubleshooting
  • 404 on /relay/discover — nginx proxy locations are missing or nginx hasn't been reloaded.
  • WebSocket connection refused — relay container is not running, or NPM WebSocket Support is not enabled.
  • LAN works, internet doesn't — NPM WebSocket Support toggle is off, or the inner nginx Upgrade headers are not set.
  • Internet works, LAN doesn't — port 8765 is blocked by the host firewall.
  • Find Games shows nothing — the host hasn't clicked Host Game yet, or the relay container restarted and cleared its room list.
v4.9 NEW: Ricochet system — shells at shallow angles bounce off armour with a distinct spark and sound; sloped-armour tanks (T-34, Panther, King Tiger) get a mechanical bonus. NEW: Tank recovery — destroyed friendly tanks may leave recoverable wrecks in Attrition/Strategy; park nearby for 12s to field-repair to 25% HP. NEW: Dynamic weather — Rain, Fog, and Dust Storm conditions affect visibility, movement speed, and AI behaviour; weather can change mid-battle. NEW: Supply crate symbols — HP (cross), Smoke (cloud), Artillery (ballistic arc) markings on crate faces. NEW: Game renamed to "Treads of War" with new logo and favicon. IMPROVED: Difficulty levels rebalanced with clearer progression from Easy to Hard. IMPROVED: Dense fog forces extremely close engagement ranges. FIXED: Arcade life tank icons now face the correct direction.
v4.8 Landing page redesigned: wider layout, improved section headings and card borders, screenshot labels styled as chapter headings. Smoke, artillery, and spotter plane restricted to Strategy mode. Spotter plane (X key) reveals enemy positions on minimap for 25 seconds. Enemy tanks hidden from minimap in Strategy until spotted. Objective capture point redesigned as a transparent cylindrical wall rising from the ring boundary.
v4.7 Merc Tank Editor: full visual and stat editor for the Obliterator, toggled in Settings. Editable custom designation, all combat/mobility stats with +/− controls, and per-part visual transforms (body/turret width, height, raise; gun length and radius). Changes persist between sessions. Online beta warning shown on Online lobby screen. Settings panel widened to fit all tabs. Tank preview background darkened for better contrast.
v4.6 LAN Duel renamed to Online mode. Online lobby redesigned: tank selection and faction remain visible on the lobby screen; host/join controls replace the mode column. Enemy shells now visible to clients as team-coloured tracers with between-snapshot physics interpolation. Player death in online play shows Defeat screen immediately (no lives system). Victory/Defeat screen: two buttons — Main Menu and Online Lobby. Mercenary warning on tank selection; Mercs hidden from selector when toggle is off. Faction-coloured border on tank preview. Mode selector arrow scaled to match text height. Buildings no longer visually overlap. Tank selector ◄/► arrows are clickable buttons; START button added to menu.
v4.5 LAN Duel expanded to up to 16 players (8v8). Team selection (Gold/Blue/Red/Green), team colours applied to tank models. Auto-submit on room discovery click. Lobby waiting room shows all connected players and teams; host picks max player count and clicks Start. Speed damage state moved to its own HUD row under HP with descriptive labels (Half speed / Quarter speed / Immobilised). Game loads with a random Allied tank selected. Death crater placed under destroyed hull (black centre shading to medium brown, 50% larger than shell craters). Last 5 tank-lengths of tracks frozen on death for dramatic effect.
v4.4 Server Setup tab documents Docker Compose, nginx, NPM proxy, firewall, and deploy steps. LAN stale-connection eviction + heartbeat ping — prevents false "room is full" errors. Code input 20% wider. Tagline: "Crush your opponent over the network".
v4.3 Trees +20% per chunk. Tree destruction particles darkened. Buildings no longer spawn on roads. Friendly fire toggle (on by default). Flash texts (tank name, encounter, hit indicator, tracks wrecked) unified at top of screen. Fleet renamed to Squad. Changelog versioned as vX.Y.
v4.2 Settings menu redesigned: tabbed layout (Settings / Controls / Help & FAQ / Changelog). LAN relay connects directly on HTTP (LAN play, no proxy needed); wss:// proxy path used only for HTTPS/internet. NPM proxy_pass fixed with trailing slash for correct path rewriting.
v4.1 LAN Duel mode: 1 v 1 over local network via WebSocket relay. Host runs authoritative simulation at 60 fps, broadcasts tank states at 20 Hz; client runs local prediction for smooth movement with server correction. Shot effects synchronised to both screens. Ping display in HUD. Find games button auto-discovers open rooms. End-game reliability (wind-down broadcast), peer name tag above opponent tank, Rematch button. Demo mode on by default; cancelled by any input. Mercs off by default. Strategy purchase expanded to all 12 main-faction tanks. FPS/score/enemies moved to advanced info block.
v4.0 Faction selector added: Allies, Soviets, Axis — each with distinct tank roster, squad compositions, and correct opposing enemies across all three modes. Axis campaign faces Allied/Soviet tanks; shop and Attrition squads updated accordingly.
v3.9 Collision radii tightened (tanks 0.85×, buildings max-edge). Phantom Sherman disposed on squad-mode entry. Ammo HUD hidden in squad modes. WAVE_COMPLETE handler guarded for Arcade. Strategy squad capped at 8 player / 10 AI. AI slower: advance 5s, halt 1.2s, fire interval 6s. Mode name shown in bottom-left HUD.
v3.8 Menu redesign: vehicle and battle mode now on one screen side-by-side. ◄/► selects tank, ▲/▼ or click selects mode, Enter starts. Settings panel shows full controls reference (updates per mode and simple/advanced setting). ← GAMES button moved clear of settings icon.
v3.7 Game mode UI polish: mode selection now navigated with ▲/▼ arrows and supports mouse clicks; controls hint updates per mode (Tab shows "switch tank" in Attrition/Strategy, "ammo AP/HE" in Arcade); ← GAMES portal button on title and end screens.
v3.6 Three game modes: Arcade (endless waves, solo — tank class upgrades after 4 kills each); Attrition (fixed squad of 5, permanent losses, escalating enemy squads); Strategy (budget purchase before each battle, objective ring capture, enemy AI buys too). Tab switches controlled tank in squad modes.
v3.5 Dynamic 8v8 battle: 8 allied tanks vs 8 enemies. Enemy AI roams the full map at high speed. Wingmen actively patrol between waypoints rather than standing still. Aim-assist toggle added to settings. Tank tracks rendered in dark grey, separate from hull. Improved Phong shading with specular highlights.
v3.4 Supply crates: three crates spawn on the map each wave — red (HP +25), blue (smoke replenishment), yellow (artillery charge +1). Drive over a crate to collect it. Crates bob and rotate for visibility; shown as coloured dots on the minimap. Collecting clears the item immediately and shows a HUD callout.
v3.3 Audio: shell pass-by crack and ricochet ping. Enemy shells that fly within 20 m of the player trigger a sharp Doppler crack and descending whoosh — once per shell. Ricochets now play a distinct high metallic ping rather than the hull-impact thud, clearly distinguishing a deflection from a penetrating hit.
v3.2 Allied wingman: a randomly selected Allied tank (M24 Chaffee, Sherman, T-34, or KV-1S) fights alongside the player each wave. It targets and engages the nearest live enemy independently. No friendly fire — shells cannot damage tanks of the same faction. The wingman is replaced fresh each wave. Shown as a cyan dot on the tactical minimap.
v3.1 Visual overhaul: vivid European summer palette (bright greens, warm earth tones), cream stone farmhouse walls with terracotta roofs, dark forest-green tree canopies, warm brown dirt roads. Sky and fog shifted to deep blue (0x99AACC). Fog pushed to 300–800 m for better long-range visibility. Ambient and hemisphere lighting brightened.
Fix Trees no longer spawn on roads. Tanks that drive into a tree destroy it on contact — the merged chunk geometry is rebuilt instantly without the felled tree.
v3.0 Artillery support: press C to call in an off-map barrage (2 per wave, replenished on advance). Six shells rain down over a 22-metre spread around the ballistic aim point 1.8 seconds after the call, each dealing area-of-effect blast damage. An incoming whistle sounds on call. The barrage damages all tanks in range — including the player. Charges shown in HUD.
v2.9 Ammo types: press Tab to switch between AP and HE. AP is armour-piercing — standard penetration and ricochet rules apply. HE (high-explosive) always detonates on contact (no ricochet), deals 50% direct damage regardless of armour, and blasts all tanks within 18 metres with area-of-effect splash damage. HE craters are over twice as wide. Tracer colour changes to yellow-green when HE is loaded.
v2.8 Smoke grenades: press G to fire a smoke canister (3 per wave, replenished on advance) along the turret bearing. The canister arcs ballistically and deploys a multi-puff grey cloud on landing. Enemy tanks cannot fire while the player is inside the cloud. Smoke clouds fade over ~14 seconds and are shown as grey blobs on the minimap.
v2.7 Enemy AI tactics: flanking approach and fire-and-move cycle. Each enemy selects a random sector around the player and approaches from that angle rather than head-on. In ENGAGING state, tanks alternate between advancing toward their flank position and halting to fire from a steady platform. Flank angle shifts occasionally for unpredictability.
v2.6 Destructible buildings: any shell that strikes a building destroys it instantly — the walls and roof are removed and replaced with scattered rubble chunks. Destroyed buildings no longer block tank movement. Shells are consumed on impact (they do not pass through). One direct hit levels the structure.
v2.5 Shell tracers: every shell in flight is now rendered as a glowing colour-coded streak — light blue for player shots, orange-red for enemy shots. The 10-unit elongated tracer rotates each frame to follow the parabolic arc under gravity, making shells clearly trackable and incoming fire easy to spot.
v2.4 Roads: three terrain-following dirt roads cross the map (E-W main road, N-S corridor, SW diagonal). Rendered as smooth quad strips that conform to terrain height. Tanks on a road ignore the cross-country slope penalty, maintaining full road speed on hills. Roads shown as brown lines on the tactical minimap.
v2.3 Tank selection preview: the menu shows a live rotating 3D render of the selected vehicle, rendered into a separate canvas using a dedicated Three.js renderer. Camera angle is front-left elevated for a clear view of the hull and turret.
v2.2 Buildings: ~30 procedural stone farmhouses (walls + roofed or open-topped ruins) scattered across the map with a fixed seed layout. Tanks collide with buildings and are pushed away — buildings act as hard cover. Spawned clear of the player start zone and water.
v2.1 Shell craters: ground impacts leave persistent dark crater decals (scorched pit + displaced earth rim) on the terrain. Up to 50 craters per wave; cleared on wave advance and game restart. Battlefields accumulate visible shell damage over the course of a fight.
Fix Controls updated: Q/E traverse turret left/right; Space/F fires. P/Esc pause in both modes.
v2.0 Target acquisition HUD: when the gun points at a live enemy (±11.5° in 3rd-person, ±4° in gun-sight), shows tank name, 8-block HP bar, and range in metres. Cone narrows automatically in sight mode for precision targeting.
v1.9 Screen shake & damage flash: cannon recoil nudge on fire, scaled shake on hit (by damage dealt), concussion from nearby explosions. Red edge-vignette flash when player takes a penetrating hit. Sight view dampens shake 70%. Ground impacts now show explosions (not sparks).
v1.8 Gun-sight camera: press V to toggle between third-person view and a first-person periscope sight (14° FOV, ~4× zoom). Authentic WWII reticle with crosshair, centre fine cross, and stadia range marks. Exits automatically on tank destruction.
v1.7 Penetration & ricochet: shots that cannot defeat the armour (firepower < armour × 0.6) deflect with a gold spark instead of exploding. HUD indicator shows hit zone (FRONT / SIDE / REAR) and result. Chaffee cannot penetrate King Tiger frontally; Tiger cannot pierce JS-II head-on.
v1.6 Directional armour from original binary: front / side / rear values per tank. Panther: 60 / 29 / 23; Tiger I: 55 / 40 / 40; King Tiger: 100 / 45 / 45. Shells resolved against the correct face based on impact angle — flanking and rear shots now significantly more effective.
v1.5 Cross-country speed: each tank now slows on slopes using original binary XC km/h values (e.g. Tiger I: 38 road → 20 XC). Speed blends continuously with terrain gradient — flat valleys at full road speed, steep hills at XC speed. Russian tanks retain better cross-country mobility than German heavies, as in the original.
v1.4 Tank selection screen: choose from all 8 Allied vehicles (4 American, 4 Russian) before battle. Stats shown with comparative bars. Enemies remain German throughout.
v1.3 Wave-based progression: three escalating waves of German armour (Pz III × 2 / Panther / Tiger I → Panther / Tiger I × 2 / King Tiger → Panther / Tiger I / King Tiger × 2). Wave-complete screen with +30 HP repair; press R to advance. Final victory only after all waves cleared.
v1.2 Stats corrected from original Archimedes binary: all 12 authentic tank types (Sherman Firefly, M36 90mmGMC, KV-85, JS-II etc.), road speeds match historical km/h, armour/penetration from original data. Tiger and Sherman now similar speed, as in original. Enemy roster: Pz III × 2, Panther, Tiger I.
Fix Player turret traverses 5% faster than enemies.
v1.1 Synthesised sound engine: diesel engine hum (pitch follows speed), cannon fire, distance-attenuated explosions, hull-impact clang. No audio files — all Web Audio API.
v1.0 Tactical minimap: player-relative rotating view, FOV V indicator, live enemy positions, destroyed wrecks, map boundary.
v0.9 Progressive damage states: half speed below 50% HP, quarter speed below 25%, with damage smoke. Death camera orbits wreck and points toward the killer on player defeat.
Fix Terrain colour banding visible across full altitude range; world palette shifted to muted olive/earthy tones matching original. Map 35% smaller. AI less aggressive.
Fix Simple controls (WASD) now the default; enemy reload times no longer affected by player bonus.
v0.8 Authentic tank geometry from original Archimedes face data — proper triangulated hull and turret meshes per tank type, friend/foe colour coding.
Fix I/O turret keys, P-to-fire in simple mode; faster reload; edge warning; lighter boundary.
v0.7 Map boundary walls, terrain cutoff, ballistic elevation, WASD simple controls.
Fix Enemy fire rate reduced and randomised; reload time cut 25%.
Fix Tank collisions, player aim assist, destroyed hull with persistent fire and smoke.
Fix Turning responsiveness, track equalization, faster friction.
Fix Terrain clipping resolved; correct world-space slope normal, smaller tile size.
v0.6 Procedural trees scattered per chunk, merged into single draw calls.
v0.5 Game states: menu, pause, victory and defeat screens, kill scoring.
v0.4 Enemy AI with four states: Idle, Seeking, Engaging, Retreating.
v0.3 Shell ballistics with gravity, muzzle flash, explosion particles.
v0.2 Dual-track tank physics (H/N/K/M), third-person camera with heading lag.
v0.1 Fourier sine-wave terrain, flat-shaded vertex colours, rolling chunk system.
Settings are remembered between page loads. Change any toggle in the Settings tab and it will be restored next visit. Use the button below to reset everything back to factory defaults.
Arcade Mode
ARCADE MODE
SPEED– km/h
HEADING–°
POS
FPS
SCORE0
ENEMIES
● READY HP 100% ♦♦♦
AP