Repository navigation
Release notes 4.0.0
Everything that changed in version 4.0.0 of Filroden's World Map Builder. The overview is the one in the module's version history; the sections after it list every feature, improvement and fix.
Version 4.0.0 rebuilds the module's foundations and its interface, and adds a generator that populates the map. The main changes are:
- A web version: the same map builder runs in a browser at fwmb.filroden.com, with maps saved in the browser, exported or imported as JSON files (so a map can move between the web and Foundry), and backed up all together in one file.
- A generator for the world's people: the new Generate tool settles the map with towns, castles, roads, river trade and sea lanes, and divides it into realms, duchies and counties, from the terrain and climate you made. Cultures choose where they live and what they call their places, a run can pass through several ages that leave ruins and old roads behind, and anything you edit or lock is kept when you generate again.
- Exploring the world: thematic layers colour the map by its people, farmland, danger, cultures and trade; History shows the map as it was in each earlier age; Travel shows how long journeys take; and on a regional map, Fill in adds the villages and market towns between the places it inherited.
- A new studio: the tools are grouped on the rail by the stage of making a map they belong to (Shape, Populate, Finish). Each tool's panel says what its settings rebuild and which tool comes next, and a bar above the map holds the tool's modes.
- An inspector for everything on the map: choosing a region, route, pin, label, river, fault, decoration, land mask, layer or layer set opens it beside the map. Changes apply at once, and each is one step of undo.
- Regions are painted: the map is divided into small cells, and a region is the cells it owns. Regions are painted with a brush, filled and erased, organised into layer sets and nested layers, and claim the sea along their coasts by themselves.
- Routes find their own way: a route is a chain of waypoints, and the module finds the way between them over the terrain, so a road winds round the mountains and keeps to land and a sea lane keeps to water.
- Styles for pins, routes, labels and region fills: a named style sets the look of everything that uses it, new maps start with a set of each, and a style is edited in the inspector like anything else.
- Fonts for labels: 29 fonts come with the module, from book serifs to blackletter and handwriting, with bold and italic where the font has them, so a map's labels look the same in Foundry and on the web.
Note: A map saved by an earlier version is converted the first time it is opened: its regions become cells and its routes are traced along their old lines, as closely as the cells allow. The conversion is kept when you next save the map, and the original shapes stay in the saved data. Regions and routes drawn with the old node tools can only be edited with the new tools.
Note: Most settings have moved into the tool they affect (the climate settings are in Biomes, the water settings in Terrain, the grid in Cartography), and the Settings tool and the Style Library are gone. The Where did it go page lists every move.
A new twelve-page tutorial builds one complete map with nearly every tool, step by step, with a map file to start each page from.
- Web version: The whole map builder runs in a browser at fwmb.filroden.com, with the same tools, panels and dialogues as in Foundry. Maps are saved in the browser's own storage, and the Maps tool's JSON export and import carry a map between the browser and Foundry in either direction (a map made on the web keeps its images when imported into Foundry). Export to scene is only offered in Foundry. Browser storage can be cleared by the browser, so keep JSON exports of maps you care about. On the web, a Full screen button on the rail takes the page in and out of full screen.
- Touch screens: The map builder works with a finger as well as a mouse, in Foundry and on the web. Tap and drag with one finger, pan and pinch with two, press and hold to finish a line, double-tap to open an item, and hold a label, decoration or pin while a second finger twists or pinches it. On a touch screen the canvas hint words each action for a finger. Shift, Ctrl and Alt with a click still need a keyboard.
- The rail: The tools sit in stages: Shape (New map, Terrain, Biomes, Rivers and faults), Populate (Generate, Regions, Routes and pins, Labels) and Finish (Cartography, Export), then Explore (History and Travel) for looking at a finished map. Below them are the occasional tools (Reference image, Styles and icons, the 3D view and Appearance), then Save, Save as and Maps, then Help. On a short window the occasional tools fold into a More menu, and on a very short one Save, Save as and Maps join them. On a narrow window the rail keeps its icons and hides the stage names. The arrow keys move along the rail.
- Tool panels: Every panel starts with the tool's name and its place in the order of work, and its settings are in sections you can fold, each marked with what it rebuilds ("rebuilds the whole map", "rebuilds climate and biomes", "instant" and so on). While you edit, the sections that would regenerate the map are dimmed. Start and Stop begin and end editing, and Next at the foot of the panel goes to the next tool with a line saying why.
- The bar: A bar above the map holds the active tool's modes (such as Select, Paint, Erase and Fill), the settings of the mode in use (brush size, transport, the style the next object gets) and what you are working on. It always stays on one row: when the window is narrow, the least used modes move into More, then the others show only their icons. Choosing an editing mode starts editing, and every tool with something to choose has Select, which lets you pick and inspect without changing anything.
- The inspector: Choosing an object on the map, or its row in a list, opens it in a column beside the map, with its fields grouped as the object needs (a route's path, line and label; a level's borders; a fault's settings for its type). Each change applies at once and is one step of undo, sliders apply when you let go, and double-clicking a slider puts back the value it had when the inspector opened. Focus view zooms to the object, an owned label has Go to for its pin, route or region, and a new object opens in the inspector as soon as it is placed. Ctrl+Z works with the inspector open, and Escape closes it.
- Regions: Regions are painted onto the map's cells rather than drawn as polygons. The Regions tool has Select, Paint, Erase and Fill modes (Fill takes the connected land under the pointer, outlined before you click; Shift inverts Paint, Erase and Fill), with the brush size on the bar; painting shows at once, water is left alone so coasts stay clean, and every stroke is one step of undo. What a region owns at sea follows from its coast: each layer has a Territorial waters distance, and after every stroke the layer's water goes to the nearest region by sea distance, so a strait between two realms is shared along its middle. Regions live in layers (what used to be region layers) grouped into layer sets; a layer can be nested inside another, so a duchy's regions stay inside their kingdom, with a free mode that allows anything and shows where the nesting is broken. Each layer has its own border style (colour, thickness, dashing, a separate style for borders at sea, and whether it scales with the map), opacity and territorial waters, and each layer set its own opacity and visibility. While you paint, the layer being painted is drawn at a working fill and the layers above it as borders only, so a parent region's outline is there to paint inside. Regions can be merged into one another.
- The Regions lists: The panel shows your layer sets, then the chosen set's top layer, then each layer below it showing only the regions inside the region chosen above, as deep as the set goes, so you can step down from a realm to its provinces and their counties. Each list ends with + Region in its parent, and the last with + Layer below, so a set's structure can be laid out before it is painted. A new entry is named in the list itself. Each region shows how many regions it holds in the layer below. A new map starts with one layer set holding one layer, ready for regions.
- Routes: A route is a chain of waypoints on the map's cells, and the module finds each leg between them. Draw adds a waypoint on each click or traces a stretch when you drag (the stroke's bends become waypoints, as many as the Detail setting keeps), previewing the next leg as you move; right-click, Enter or a double-click finishes, Backspace, Ctrl+Z or the Undo button takes the last click or stroke back, and Escape abandons. Waypoints drags a waypoint (its legs are found again as it moves), inserts one with Shift+Click, removes one with Ctrl+Click, splits a route with Alt+Click and joins two routes by dropping an end on an end with Alt held. Path chooses Follow terrain (the easiest way for the transport, avoiding steep ground) or Straight; Transport is Road (keeps to land, and prefers to join roads already there) or Sea (keeps to water), fixed once the route is drawn; Span water lets a road bridge narrow water. A waypoint the route cannot reach is refused. In the inspector, Simplify drops the waypoints that barely bend the route and Re-path finds every leg again (for example after the terrain changed); each route also has a Class (Trunk, Main or Minor) for other modules and the exported data, its own Outline and Smoothing, and a thickness in quarter pixels.
- Styles: Pins, routes, labels and region fills each have named styles. A style is opened from its row in Styles and icons and edited in the inspector, where each change applies to everything that uses the style, as one step of undo; each list ends with a row to add a style, and a style's menu renames, duplicates or deletes it (deleting tells you how many objects use it, and they keep its look). Save as… in any object's inspector makes a style from that object. New maps start with seventeen pin styles (Capital, City, Large town, Town, Market town, Large village, Village, Castle, Fortified town, Port, Ruin, Ruined capital, Ruined city, Ruined large town, Ruined town, Abandoned castle and Landmark), ten route styles (Trunk road, Main road, Minor road, Track, Lane, Old road, Sea lane, Minor sea lane, River trade and Minor river trade) and ten label styles (Realm, Duchy, County, Capital, Settlement, Place, Water, Note, Road and Sea lane); maps you already have keep their own styles, and Generate adds the ones it uses when a map lacks them. A route style can belong to roads, sea routes or river routes, and the style lists for a route offer only the styles for its transport. Five new pin icons: a star and four circle-and-dot variants.
- Label fonts: 29 fonts are included with the module and offered in a picker that shows each in its own face, grouped as studio faces, book serifs, old print, engraved capitals, calligraphic, blackletter, handwritten, sans serifs and other scripts, covering Latin, Greek, Cyrillic, Devanagari, Arabic and Hebrew. In Foundry the picker also lists your world's own fonts. A font is downloaded only when a label uses it. Labels gain Bold and Italic; a font without a bold or italic face shows the control greyed out and draws the label regular, keeping the setting for a font that has it. A map naming a font that isn't available draws its labels in Noto Serif (the new default label font) and tells you which fonts are missing.
- Mass edit: Mass edit for pins, routes, standalone labels and a layer's regions shows the inspector's fields for several items at once. Each field shows the value the items share, or Mixed where they differ, and only the fields you change are applied (to every chosen item, as one step of undo); ↺ puts a field back. Bold, Italic, Outline and Smoothing are Leave as is, On or Off, and Visibility can be set for the item and for its label. A layer's regions are chosen from Edit several regions… in its menu.
- The labels list: The Labels tool lists every label on the map, including those of pins, routes and regions (with their owner beside them), and a search field with Made by and Kind of label filters narrows it to standalone labels, the labels of one kind, or the names with no room.
- Appearance: An Appearance button on the rail chooses light, dark or automatic (following Foundry's interface theme, or the system preference on the web) and the gold or teal hue, applied at once, in both versions. The hue setting moves out of Foundry's module settings and keeps your choice.
- Help: A Help button at the foot of the rail opens Help beside the map without changing anything you are working on, and closing it brings back what the inspector showed. Help has the module's version, links to the repository, the licence, the changelog, the wiki, the tutorial, reporting an issue and the other version (the web version from Foundry, the Foundry module from the web), every keyboard and mouse shortcut by tool, and the libraries, icons and fonts the module includes with their licences. Copy version details copies what a bug report needs (the module and host versions, the browser, the graphics card's limits and the map's size).
- Shortcuts sheet: Press ? to see every keyboard and mouse shortcut, by tool and mode.
- Area factor: New map sets how much smaller the world is than its latitudes alone would make it (1 to 40, default 15). It sets what a pixel measures in kilometres for the distances the module works out from the map's scale and changes nothing that is drawn, except a scale bar set to match the world. A regional map keeps its parent's.
- Map unit: New map names the unit every distance is shown in (km unless you change it). The module works in kilometres and shows the number with your name for the unit. The scale bar is labelled with it, and its new Match world scale option (on for new maps) makes the bar true to the world, with a round distance per tick. A layer's territorial waters and the scale shown under the area factor use it too. A map whose scale bar still said Miles, the old default, now says km.
- Thematic layers: A new menu in the map controls draws what the generator's last run left on the map over it as colour, with five layers: Population and Capacity (people, and the people the land could feed, per area of land), Cleared land, Danger and Culture (each place's main culture in its colour, paler where peoples mix). Beside the colour layer, Trade draws the run's trade as lines whose width follows how much passes along them, coloured by road, river or sea. The value under the pointer joins the information bar, with a foldable legend for each layer below it, and the colour layer's opacity is set in the menu. The layer is saved with the map and exported with it, and moves with the land when the terrain's noise is panned or rescaled. A regional map keeps a copy of its parent's run over its area and shows the parent's layers until it is generated itself (an older regional map gets the copy when opened, from its saved parent).
- History: A new tool in its own Explore stage shows the map as it was in each earlier age of a run: that age's realms, towns, castles, roads and names drawn in the map's own styles, with the age in brief, its realms (those gone by the present marked), and what changed by the next age (realms that rose and fell, places founded and lost, each people's share of the land). The Culture thematic layer shows the age's peoples, and Export this age saves any age as a PNG named with it.
- Travel: A new tool in the Explore stage shows how long journeys take from a place you click, on foot, by wagon or by fast mount: the land is coloured in bands of days (a day each on a small region, up to ten on a world, or as you choose), a numbered line marks each band, and the quickest way to the pointer is drawn with its time in the information bar. Journeys follow the map's own roads, river trade routes and sea routes, whether generated or drawn; off the roads, mounts and wagons lose most of their lead, farmland is quicker than the wilds, and away from the sea routes only small boats are found. The speeds can be changed for each map, and Export this journey saves the view as a PNG named with the way of travel and the start.
- Relief emphasis in the 3D view: The 3D view has a Relief emphasis slider in the top corner of the view that sets how strongly the light picks out land rising gently over large areas, such as wide plains and long inland slopes. It is saved with the map.
- Export tool: PNG export and Export to scene are in their own tool at the end of the rail, with their settings.
- Backup: Back up all maps in the Maps tool saves every map, with the images and custom pin icons it uses, in one zip file. Restore from backup adds the maps you choose back as new saved maps, regional maps under their parents. Nothing already saved is changed: a map that is already saved comes back as a numbered copy, and a summary names each one. A backup larger than 200 MB can be made without its images.
- Generate: A new tool at the head of Populate settles the map in one run. It places capitals, cities, large towns, towns, castles, fortified towns and ports where the land can feed and defend them, links them by roads, river trade routes and sea lanes along the ways trade would take, and divides the land into realms, duchies and counties in a Political layer set, all named in one of 43 name styles. World sets the population density, urbanisation, realm spacing and fragmentation, and Output chooses the political levels, the kinds of place and route, whether names are shown and whether the default styles are used. The run happens in the background, showing its progress, and Cancel leaves the map as it was. The panel estimates how long a run will take, marks the last run out of date when the terrain, climate or settings change, and says when a map is too small to hold many places. Results counts what the last run made, and the whole run is one step of undo.
- Generate again keeps your changes: Anything the generator made that you edit (renamed, moved, repainted or given its own look) or Lock is kept when you generate again, and a kept region keeps its whole realm. Everything else is replaced, and the new run fits round what you kept. Each generated object's inspector has a Generated section with its figures and what Generate again will do with it, and generated rows in the lists have a lock button. Remove generated content takes away everything the generator made except what you kept.
- Cultures: The Generate tool's Cultures section holds the map's peoples. Each has a colour, a name style, how open it is to mixing and how densely it settles, a habitat (temperature, moisture, height and relief ranges, and whether it seeks or avoids coasts and rivers) and homelands, which you pick on the map or leave for the run to place (apart from each other and the map's edges, narrowest habitats first). Cultures spread from their homelands over the land that suits them, and each place is named in the language of the people living there. Places and realms list their mix of cultures, and Results gives each culture's share of the population. Without cultures, one people lives everywhere.
- Ages: A run can pass through up to eight ages, each with an era (Early medieval, High medieval or After a great plague), a strife (Peaceful, Troubled or War-torn) and, with cultures, an event in which a culture arrives or invades. Each age starts from the one before: towns tend to stay where they were, roads stay built and kingdoms keep their seats where these survive. The age before the present leaves ruins, abandoned castles and old roads in their own styles (a ruin keeps the icon of what it was, in red), and a place that was once a capital has "(former capital)" after its name. Each place's details give its history through the ages. During a long run, Keep finished ages stops it and places the ages already done.
- Fill in: On a regional map, Generate's new Fill in section adds villages and market towns between the places the map inherited, joined to the inherited roads by lanes, and leaves everything inherited as it is. It shares out the people of the parent's run: market towns fill the gaps more than half a day's walk from any town, about one farmed place in fifteen becomes a village (one in the map's area factor; those of 1,000 people or more are large villages), and all of them stand within about 15 km of an inherited road, river route or town (about 30 km round a town of 4,000 people or more, and 45 km round one of 15,000 or more) and clear of the rivers as drawn. A city's people are drawn from the country round it, as the run sized it, so the land round a capital is filled in too. A larger area factor gives fewer villages and market towns further apart. It is offered once the regional map shows its world closely enough, can be asked for when a regional map is cut (Fill in villages and market towns), and Fill in again replaces the last fill-in except what you have edited or locked. Market towns and large villages show from the new Local detail level and villages at Everything, in the new Market town, Large village and Village pin styles and the new Lane route style.
- Behaves like: A custom biome can behave like one of the built-in land biomes for Generate (how well it farms, how hard it is to cross and how much cover it gives), so a haunted wood can count as a forest.
- Detail level: A Detail menu in the map controls shows the map at World, Province, Regional, Local or Everything, from capitals, cities and realms alone to every village and county. Each pin style has a detail level for its pins and a Name detail level for their names, so a tier's places appear one step before their names. Routes show at every level, and a generated map's duchies and counties show with their names from Province and Regional. Exports follow the detail level (a scene's journal pages go only to the generated places, routes and regions it labels), and a run, or a new regional map, starts at the level that suits the map's scale.
- Names keep clear of each other: The names of places, regions and routes are placed so they don't cover each other or the pins. A place's name tries eight positions round its pin, a region's name several places inside its region, and realm names take precedence. A name with no room is left out (shown faintly while you edit labels, so you can drag it into place, and marked No room in the Labels list). Avoid overlaps in the Detail menu turns this off.
- Labels and Regions menus: The map controls' Labels and Regions buttons list every label style and every layer, so you can hide the names of one style or the regions of one layer; exports follow. Fills at the foot of the Regions menu shows regions as borders alone.
- Symbol size: The Detail menu sets how large pins and names are drawn. Auto draws them larger on a regional map, by how closely it shows its world, so they can be read at its scale, and a size from 75% to 250% can be chosen instead. It is saved with the map.
- PNG scale: Export to PNG asks for a scale (1× to 4×, each with the image's size in pixels) and recommends the smallest at which the smallest name shown can be read. Names are drawn afresh at the chosen scale, so they stay sharp.
- Searching long lists: The pins, routes and labels lists have a search field, a Made by filter (generated or hand-made) and a filter by kind, and Mass edit's Delete deletes the chosen items.
- Converted maps: Maps saved by earlier versions are converted on their first open with a progress overlay, and a notice asks you to save. Region layers become layers of a layer set, regions become cells, routes are traced along their old lines and keep their smoothed look, and the pins gain the cell they stand in.
- Settings where you use them: New map holds the engine, seed, size, latitude and area factor; Terrain the shading and water; Biomes the climate, moisture, biome colours with custom biomes and the rule editor (Edit biomes), and the biome opacity; Rivers and faults the hydrology; Cartography the grid. Styles and icons manages the styles, the pin icons and sharing them with another map.
- Dialogues inside the studio: Every dialogue that remains opens inside the map window rather than as a separate Foundry window, so it can never be lost behind the map, and it can be moved by its title bar and resized. Buttons run from negative to positive, and the Enter key presses the default button.
- Lists: Every list (regions, pins, routes, labels, rivers, faults, decorations, land masks, custom biomes, styles and pin icons) works the same way: clicking a row opens it, the row being inspected is marked, and its actions are always shown. Each list is one stop for the Tab key: Up and Down move through it, Home and End jump to its ends, Enter opens a row, and focus stays in the list so you can step through the items and watch the inspector follow. An empty list says what to do to fill it.
- The canvas overlays: The information bar, the hint, the map controls and undo and redo are always shown, in fixed corners that stay clear of each other at any window size. The hint lists the active mode's own actions first. The map controls fold their layer toggles into a Layers menu on a narrow window, and every toggle shows whether its layer is on, however it was changed.
- The 3D view: It now picks out gentle, large-scale relief (Guided maps especially), and its light comes from the same direction as the flat map's relief shading. The canvas hint shows in the 3D view with its rotate, pan and zoom actions.
- Panning and rescaling the noise: Zooming, nudging or resetting the Standard engine's noise now carries regions and routes along with the terrain, as it already did pins, labels and brush strokes, and Undo steps the terrain back along with everything on it (before, it put the content back over terrain that stayed where it was). A route pushed off the map is cut to what remains.
- Regional maps: A region that crosses the crop edge is kept, even when none of its old nodes fell inside the crop, and routes are cut at the crop edge into one route per stretch inside. Custom region fills are copied to the regional map, and the scale bar stays over the same land with ticks the same length on the map. The crop is a mode on the New map bar.
- Region opacity: The single Region Opacity slider is replaced by an opacity on each layer and on each layer set (which fades all its layers together).
- Scene journals: Export to scene now also makes a journal page for each named or described route.
- No map notes: Export to scene no longer places map notes on the scene. At a map's scale they covered it, and a scene has no easy way to hide them. The journal's pages are opened from the Journals sidebar; a re-export removes the notes an earlier version added.
- Scene image quality: Export to scene draws its images exactly as Export to PNG does, at a scale chosen in its dialogue (with the same recommendation), and makes the scene and its grid that much larger, so small names read in Foundry as they do in a PNG. A cell still measures the same distance. It used to enlarge only small maps' images, up to 2×, without redrawing the names, and Foundry shrank them back to the scene's size. Scales the graphics card cannot show as a scene background are left out.
- Regional grid: A regional map keeps its parent's grid size in pixels, so its scene is played at the same zoom, and each of its cells covers less ground. The zoom is a whole number when the map has a grid, with the crop fitted round what you drew, so every grid line of the parent is one of the regional map's. Regional maps made before kept a grid scaled with the zoom; set their Grid size in Cartography.
- Scene grid scale: Export to scene sets the scene's grid distance and units to what one cell measures in the map's unit, so Foundry's ruler measures true distances.
- Clone as new is offered only for regional maps, where it makes a copy that is no longer listed under its parent map.
- Cartography: Decorations have Select (which only picks) and Move (which drags, turns and resizes), so a click no longer moves a decoration by accident. Add decoration is on the bar.
- Units: A setting's unit (pixels, degrees, cells, characters) is shown after its value rather than in its name, and a label's Line width is called the same everywhere.
- Look and readability: A new look in four themes (light and dark, gold and teal) that all meet the WCAG AA contrast levels, three interface fonts included with the module (Atkinson Hyperlegible, Sora and Barlow Semi Condensed), every size in rem so the studio follows your browser's and Foundry's text size, and layouts that allow for longer translations and right-to-left languages.
- Faster regions: Region fills and borders are drawn by the graphics card from the cells, so panning and zooming a map with many regions costs a few milliseconds at any map size, and a brush stroke shows as it is painted.
-
Map files travel complete: A map's JSON export now holds its decorations, its reference image and the custom pin icons its pins use, so it opens complete in another world or in the other version (in Foundry the images are added to the world's
fwmb-assetsfolder). An imported map keeps the name it was saved under, with a number added when a map of that name exists. - Reference image: The reference image is now saved with the map, with its place, size and opacity.
- Safer imports: Map, styles and backup files are checked before anything is saved. A file that isn't from the module, is damaged, or holds text longer than allowed (names 200 characters, descriptions 20,000, label text 500) is refused with a message saying why, and an export holding text that long is refused, listing what to shorten. Text fields stop at their limit. Images are checked by what they contain rather than their name: PNG, JPEG, WebP or SVG, up to 32 MB and 8,192 pixels, with any script or outside link taken out of an SVG.
- Plain text everywhere: Names, descriptions and labels are always plain text. A description is written into its scene journal page exactly as typed (any HTML tags show as text), ready to format in Foundry.
- Finer pins and names: Size 1 of a pin or a name is now a quarter of what it was, so a map of thousands of places can be drawn without crowding. Maps and styles files saved earlier are scaled as they are read and look as they did.
- Pin names start at the edge of their pin, centred on it.
- Name outlines in proportion: A name's outline and shadow grow with its size, so a small name keeps its letters on the map and in exports.
- Shared stretches drawn once: Where several routes of one transport share a stretch, it is drawn once, in the style of the most important.
- Water routes stand out: the default Sea lane, Minor sea lane, River trade and Minor river trade styles share a pale blue that shows against the water, the main ones dashed and the minor ones dotted. A map saved earlier takes the new look when opened, for the styles and routes still in the old default colour and line.
- Names and the map edge: Names keep to the map, and clear of its border while it has one; the border is drawn over everything, so it stays clean. Places just beyond the map's edge (shown in the margin round the map in the tools that use it) keep their names off the map.
- Narrow lists: In a studio less than 1,400 pixels wide, the rows of pins, routes, regions and labels show their actions only on the row you point at, the row with focus and the chosen row, so names keep their room.
- Grid cell data: Each pin in a cell also gives its style, and for a generated place its kind, tier and population; each route gives its transport, class and style, so a road can be told from a lane (see Grid Cell Data).
- Ranges by keyboard: The handles of the biome rule editor's ranges (and the culture inspector's) take the arrow keys, Page Up and Page Down, and Home and End.
- Custom pin icons: Removing a custom pin icon now finds and reverts its uses in saved maps, not only the open one.
- PNG export: Exporting a PNG no longer turns the reference image back on when it was hidden.
- The 3D view's shadows are no longer cut off on maps larger than 4000 pixels.
- Reference image: Zoom in and Zoom out in the Reference image tool work again (they broke the image's scale).
- Hidden view filter: The map controls' Hidden filter now shows hidden items on the map while it is on (they were never drawn); exports still leave them out.
- New maps keep their latitude: Create new map keeps the latitudes and area factor set in the panel instead of going back to the defaults.
- Scale bar: Setting the minor subdivisions to 0 now draws none (it drew four). A scale bar is kept wholly on the map: on a regional map it could fall off the map (where it had been turned off on the parent, or its ticks had grown with the zoom), and a map saved like that gets it back when opened.
- PNG export leaves out the land masks' outlines, as Export to scene does.
- Names with markup: A layer or layer set whose name held HTML could run it when the layer was deleted. Names are now always shown as text.
-
Mesh engine (
src/mesh/): A Voronoi mesh of cells about 4 pixels across, rebuilt exactly from a few numbers inmapData.mesh, with the region of each layer stored as one owner array (a run-length, varint, base64 string underflags.owners) and routes aswaypointsandlegsof cell numbers.vectorSchemaVersion4;layerSetsreplacesregionLayers;Migrationconverts earlier maps, keeping the old shapes underlegacyuntil a later version drops them. The mesh is built in a worker and cached in IndexedDB. The Grid Cell Data page documents the data format for other modules. -
One UI for two hosts: Every Foundry global is behind
src/platform/(ESLint fails the build on any other use), with a Foundry implementation and a web one (src/platform/web/: IndexedDB map store, local storage settings, toasts, tooltips, a file picker element).StudioViewdraws the studio's regions from the Handlebars templates and morphs them in place with idiomorph (0BSD, vendored), so fields keep focus and value through a redraw;Overlayanddialogs.jsreplace DialogV2;MapStudiois the host-neutral controller andMapStudioWindowthe ApplicationV2 frame. The web page vendors PixiJS 7.4.2 and Handlebars, is built bynpm run pack:weband deployed by a GitHub Action on release. -
The studio's layout:
StudioLayoutmeasures the studio itself (not the browser window, which in Foundry is not the studio's size) and sets its width class, how far the rail folds, the bar's fold level (BarFold) and the canvas overlays' room. The inspector is a dockedOverlaywhose object kinds (Inspector,InspectorFields,FieldSpecs) share one field description with mass edit. The theme is generated from design tokens (styles/fwmb-theme.css), and every class is the module's own (fwmb-). -
Label data: Labels and label styles gain optional
boldanditalic(a label without them draws bold and upright, as before). Route styles gain an optionaltransport. Maps keep areliefEmphasisinparams.display. - Undo history entries are a vector snapshot (which now includes the four style lists), an owner-array patch (one merged patch per stroke) or a composite of both, so painting never clones the whole map state.
-
Route finding:
RoutePathruns a distance field over the mesh with a cost per transport; roads treat cells that already carry a road as half their cost, Span water prices a water cell at six land cells and never more than six cells from a shore. River transport is used by the generator's river trade routes; the drawing tools offer Road and Sea. -
Credits from one list:
src/data/credits.jslists every library, icon set and font with its licence; Help and the README's third-party table are both written from it, and a test fails if a vendored folder has no entry or licence file. -
Input safety (
src/data/):Sanitize,MapRules(one allow-list of every field a map can hold, used by every import, every inspector, mass edit and dialogue change, and the export check),MapImport,ImageCheckandMapPackage, with their limits inconfig.js(LIMITS.TEXT,IMPORT,IMAGE,BACKUP).__proto__,constructorandprototypekeys are dropped at any depth, and the web host'smergeObjectno longer follows them. -
Backup format: a zip of
manifest.json,maps/<id>.json(each map's JSON export, its images referenced by content hash) andassets/<hash>.<ext>. Reading one checks every entry's name, the entry count and each entry's packing ratio before anything is unpacked. -
Strings:
en.jsonis US English anden-gb.jsonholds only the British spellings that differ; a test checks that every string the code uses exists, that every string is used, and that labels are in sentence case. -
Generator (
src/generator/): A settlement, trade and realm model run in a worker on a coarse model mesh (cells about 25 effective km across): cell values, cultures, towns, rounds of trade, realms and borders, a feedback pass (castles, walls and concentration), final trade and realms, and names, with each age continuing from the one before. It is platform-neutral and tested in Node, including a parity test on a reference map.Materialisewrites a run as ordinary map content carryinggenerateddetails (run, kind, tier, source, population, culture and mix, ages, edited, locked);RegenerationandGeneratedEditsdecide what a new run keeps. The run's model cells, cultures and history are saved asmodelRun(its own flag in Foundry, quantised and base64-encoded), andMapRulescovers every new field (cultures,generatorSettings,modelRun,detailLevel,symbolSize,nameLevels,avoidLabelOverlaps,hiddenLabelStyles,hiddenLevels,hideRegionFills,behavesLike, and pin styles'tierand name level). -
Label placement:
LabelPlacement(greedy placement in priority order over a grid index, then seeded annealing among the names that compete, incremental between redraws) andLabelLayout, which builds each name's candidate places. -
Drawing:
RouteMergedraws a stretch shared by routes of one transport once. Pin and label sizes useSYMBOLS.UNIT0.25 withsizeRevision2 (older data is scaled on reading), multiplied bySymbolScale.ExportScaleplans the PNG's scale and its tiles, and the export redraws text at the export resolution. - Workers: A job worker now reads cancel and stop messages while it runs (its pauses yield to a timer at least every 100 ms).
- Name generator: The name generator and name bases from Azgaar's Fantasy Map Generator (MIT) are included, credited in Help and the README, with new Material Symbols icons for Generate, Detail and Lock.
-
Map unit (
src/data/MapUnit.js):mapUnitin the map data andcartography.scaleMatchWorldin its parameters, both allowed byMapRules. The oldcartography.scaleUnitsis only read when an older map opens, and is no longer saved. A change of latitude now updates the open mesh's km per pixel as the area factor already did. -
Thematic layers (
src/thematic/ThematicData.js,src/canvas/ThematicLayer.js,ThematicView): graded model-cell values blended to the display cells by barycentric weights (culture drawn per model cell as classes, its colour fading with the dominant share) in the model sites' Delaunay triangles, placed on fixed scales, and drawn by a GPU quad sharing the region fills' cell-id texture with a one-byte-per-cell values texture and a 256-colour lookup. The run now saves each model cell's land area (landArea), andModelRun.resampleModelRunmoves a run with a noise pan. The run also saves the final trade on each model edge (tradeFrom,tradeTo,tradeKind,tradeValue, against the busiest edge), whichThematicData.tradeLinesdraws along the generated routes' legs andTradeFlowLayerpaints as onePIXI.Graphicsover the routes.thematic(colour layer, line layers and opacity) is saved with the map and allowed byMapRules. -
History (
src/history/PastAge.js,HistoryView,templates/tools-history.hbs): a run now keeps for each earlier age its place, castle and realm names (named after the present's, so those are unchanged), each realm's people, each cell's main culture and its roads (placeNames,castleNames,castleKeeps,realmNames,realmPeople,culture,roadFrom,roadTo; seats keep their realm's slot as -1 when moved off the map). The tool draws an age through a secondMeshSessionon the map's mesh with one layer set made from the age's realms (laid out withMaterialiseRegions.pastRealmLayer), its places as pins in the tier styles and its roads laid byMaterialiseRoutes.buildRoutes; nothing of it is saved but the age chosen (historyAge).PastAge.matchRealmscarries a realm on as the later realm holding its seat or most of its land. -
Travel (
src/travel/TravelGraph.js,TravelTime.js,TravelGrid.js,TravelNetwork,TravelView,src/canvas/TravelLayer.js,templates/tools-travel.hbs): a worker tasktravelGraphbuilds the generator's model cells andCellGraphfrom its payload over the map's travel cells (the model cells, or on a regional map a finer set of display sites about 10 px apart, with relief scaled to the generator's cell size), cached per mesh until the terrain changes. Each edge's time comes from the speeds, off-road shares by way of travel and cleared land, the generator's land costs softened, direction on rivers and a wait for passage going aboard; the map's routes flag road, river and sea edges, and edges longer than 2.5 cell spacings (the hull's slivers along the map's edge) are not travelled. A Dijkstra search gives one-way times, drawn as day bands in the thematic layer's slot (blended per display cell), rings joined into lines and smoothed once, and the way to the pointer.travel(way of travel, speeds, band width and start) is saved in the UI state. -
Regional in-fill (
src/generator/ParentRun.js,Infill.js,src/applications/RunCells.js,ParentRunRecovery,InfillInput,Infilling,src/data/LocalLevel.js): a regional map savesparentRun, its parent's run cropped to its area with a margin (each cell's site in the regional map's pixels), whichRunCellsgives the thematic layers and Travel when the map has no run of its own;ParentRunRecoverycrops it from a saved parent for older regional maps. A worker taskinfillrunsrunInfillon the travel model's finer cells (about 5 effective km apart): the parent's people shared by food, market towns by reach on foot, villages by a seeded weighted sample, lanes along a quickest-way tree, and names; the cells under a drawn river (from the river image) are left out. Its pins and routes carrygenerated.infill; a cut setsinfillPendingwhen its option is ticked. Detail levels are now 0 to 4 with Local at 3; maps and styles files saved before carry nolocalLeveland keep their Everything (LocalLevel).MapRulescoversparentRun,infillPending,localLevelandgenerated.infill.MeshSession.riverChannelmarks the cells withinMESH.ROUTE.RIVER_CHANNEL_MARGINof a drawn channel in the river image (refreshed whenever it is drawn), which river routes' costs follow in place ofriverCount;RiverRelaylays a regional map's inherited river trade routes again once (riverRoutes), andWaterRouteStylesgives older maps' water route styles the new look once (waterRoutes). -
Tests:
npm testruns the Node tests intests/(mesh engine, persistence, worker protocol, regional extraction, lighting normals, and the studio's panels, bar, inspector, lists, styles, mass edit, Help, credits and strings in happy-dom), on every push through GitHub Actions and before a release is packed. Two headless Chromium smoke checks exercise the real studio in a stand-in Foundry window and the web version. - Dependencies and licences: idiomorph 0.7.4 (0BSD); fflate 0.8.3 (MIT) for backups; DOMPurify 3.4.16 (Apache 2.0) for cleaning SVG images; for the web version PixiJS 7.4.2 and Handlebars 4.7.10 (MIT); the three interface fonts and 26 label fonts (SIL Open Font License, from Google Fonts); new Material Symbols icons (Apache 2.0). Each has its licence file and README row.
Tutorial
- A new world
- Shaping the land
- Climate and biomes
- Rivers and faults
- Populating the world
- Realms and provinces
- Roads and sea lanes
- Places and labels
- Exploring the world
- Finishing and sharing
- A regional map
- Further tips
Shape
Populate
Finish
Explore
More tools
Release notes