Naval Battle Simulator

Age-of-sail combat for any TTRPG: configure ships, read the wind, commit your orders, and watch the turn unfold — then check whose broadsides bear.

sailing

Setup

Install the Plugin

The simulator ships with Fey-Gate as an example plugin. Copy examples/plugins/naval-battle.js from the repository into your campaign's plugins/ folder, then approve it under Settings → Plugins (see the plugin guide). A ship's-hull button appears in the VTT toolbar — DM only.

Ships Are Tokens

Every ship is a normal token with a rotatable hull sprite — position and heading sync through the regular token channel. Connected players are offered the plugin automatically when they join (one accept prompt); with it they see rigging, the wind rose, and can steer their own ships. Spawn fresh ships from the fleet panel, or turn any existing token into a ship with Make ship.

Ship Classes

Three built-in hull classes: the nimble Sloop (light, one mast, quick off the line), the balanced Frigate, and the Ship of the Line (heavy, fully rigged — slow to build way, but with more sail area her top speed is the highest of all; catch her before she gets going). Class configuration drives everything: weight, sail count, turn rate, motor output, colour, token size, and armament.

The Ship Designer

Open Data Manager → Ship Classes to edit classes or create new ones. Set hull weight (acceleration and drag derive from it), sail count (top speed — masts render spaced along the deck), turn rate, motor speed, colour, and token size; the pane shows the derived sailing numbers as you tune. Cannons are placed visually: click around the hull preview to add a cannon facing that direction — bow chasers, stern chasers, asymmetric broadsides, anything — then fine-tune each one's facing, arc width, and range. Changes re-skin ships already on the board and sync to players immediately.

air

Wind & the Sailing Model

One Wind Per Battle

The panel's compass shows where the wind blows from, in degrees (0° = north). Strength sets the fleet's baseline pace in grid cells per second at full sail on the best point of sail.

Points of Sail

Speed depends on your heading relative to the wind. Within 30° of dead upwind you are in irons — sails luff, speed bleeds to nothing. Efficiency climbs as you bear away, peaks on a broad reach (~135° off the wind), and drops to about 70% running dead downwind. Crossing the wind means swinging through the dead zone — time your tacks with way on.

Inertia and Steerage

Hulls accelerate and shed speed gradually — a Ship of the Line takes most of a turn to reach full pace. Rudders need water flow: a becalmed ship barely answers the helm, while a ship at speed turns at her full class rate. Getting caught in irons with no way on is as dangerous as it was in 1780.

explore

Orders & Resolving Turns

Give Orders in the Ship's Detail Window

Click a ship token to open its detail window — the Ship section holds the helm: Heading (the course to steer toward, in degrees), Sails (Furled / Half / Full), Sail angle (yard trim), and Motor. Ships turn toward the ordered heading as fast as their speed and class allow — a 180° order is a manoeuvre, not a teleport. Tick Smooth turn to pace the swing across the whole manoeuvre instead of throwing the rudder hard over — the ship arrives on the new course right as the turn ends (an order beyond her turn rate still degrades to "as fast as possible").

Setting the Scene (DM Only)

The DM's ship section has a second block: Heading now and Speed now set the ship's actual state instantly — no order, no manoeuvre. Use it to open a battle mid-chase, with fleets already at speed, instead of watching everyone accelerate from a standstill.

Every Captain Steers Their Own Ship

The DM can steer any ship. A connected player running the plugin can steer ships whose token they own (set the token's owner in the detail window) — their orders travel to the DM, who verifies ownership before applying. Everyone else sees the section read-only.

Resolve Turn

When every captain has committed, the DM presses Resolve Turn in the fleet panel. All ships sail simultaneously for five seconds of animated movement, computed from wind, sails, heading and inertia. Positions stream to connected players live; the final poses are exact. Momentum carries between turns — speed is remembered.

The Fleet Panel

The toolbar panel is the DM's fleet command: wind direction and strength, spawning and linking ships, the cannon-arc overlay toggle, and Resolve Turn. Per-ship steering lives in each ship's detail window. Collisions are not simulated — ships pass through each other (rule it as you see fit).

destruction

Cannon Arcs & Gunnery

Firing Arcs

Tick Show cannon arcs (it also switches on automatically after each resolved turn) to overlay every ship's broadside arcs — 120° wedges to port and starboard, with range set by hull class. Arcs rotate live with the ship.

Reading a Firing Solution

A wedge glows red when an enemy hull lies inside it, and the target gets a red ring. That's your cue: the guns bear. What a hit does — damage dice, crits, morale — is your game system's business; the simulator answers only "can you hit them from here?".

The Classic Play

Because guns point sideways and speed comes from the wind, naval tactics emerge naturally: fight for the weather gage, cross the enemy's bow or stern where no guns bear, and don't get caught in irons under a broadside.

code

Make It Yours

It's Just a Plugin

The whole simulator is one readable JavaScript file written against the public plugin API — the same API available to you. Tweak the class table, add a fourth hull class, change arc widths, or bolt on a damage system with api.net messages.

Custom Hull Art

Ships use a built-in hull silhouette by default. Give any ship real artwork by setting the token's image to a top-down sprite facing "up" — with imageFit: 'contain' it rotates with the heading automatically.