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.
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.
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.
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).
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.
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.