Web application generating interactive and highly customizable maps
Find a file
barrulus c4663e7b9b fix: sky port behavior, default sky altitude, Sky Realm robustness, and unfly state restore
Summary

Ground burgs with sky ports keep land capabilities and land routes.
Only truly flying burgs join the Sky Realm; turning off “flying” restores the ground state.
Replace magic altitude 1000 with a DOM-configurable default.
Guard state hover/pin logic for geometry-less Sky Realm to prevent console errors.
Watabou link uses sky settings only for flying burgs.
Details

Land routing with sky ports:

Change: include sky ports in land road/trail networks; exclude only flying burgs.
Why: sky ports should not impose flying/land restrictions on a ground burg.
File: modules/routes-generator.js
Sky port toggle does not move state:

Change: toggling skyPort no longer assigns the burg’s state to the Sky Realm or reassigns cell ownership.
Why: sky port ≠ flying city; it’s just air connectivity.
File: modules/ui/burg-editor.js
Flying toggle and state restore:

Change: enabling “flying” assigns the burg to the Sky Realm but does not overwrite the cell’s ground state; disabling “flying” restores the burg’s state to the underlying ground state (pack.cells.state[burg.cell]).
Change: when relocating, assign Sky Realm only if the burg is placed over water; ground placements keep ground state.
Why: fixes bug where reverting to ground left burg in Sky Realm and preserves ground sovereignty.
File: modules/ui/burg-editor.js
Default sky altitude via DOM (no more magic 1000):

Change: add hidden input #burgDefaultSkyAltitude (default 1000 m) and read it everywhere altitude is defaulted (editor and “add burg on water” flow).
Why: centralizes default, documents units, and makes it configurable without touching code.
Files: index.html, modules/ui/burg-editor.js, modules/ui/burgs-overview.js
Sky State creation robustness:

Change: initialize a neutral diplomacy row for the new Sky State and extend existing states’ diplomacy arrays.
Change: do not forcibly set the anchor cell ownership to Sky state when creating the Sky Realm.
Why: prevents UI/editor crashes that assume diplomacy is rectangular; avoids accidental land transfer to Sky Realm.
File: modules/ui/editors.js
State hover/pin guards for Sky Realm:

Change: skip fog/hover/highlight when the target state has no geometry (e.g., Sky Realm) or the path is missing.
Why: fixes console errors in State hover and Pin feature.
Files: modules/dynamic/editors/states-editor.js, modules/ui/diplomacy-editor.js, modules/ui/military-overview.js
Watabou integration:

Change: only treat burgs as “sky” for city links when flying is true (not when only skyPort is set).
Why: ground burgs with sky ports should still have gates/roads/hubs/shanty, etc.
File: modules/ui/editors.js
User-visible Effects

Ground cities can have sea port + sky port + roads/trails simultaneously.
Toggling flying on shows altitude row; default altitude is read from the DOM.
Toggling flying off restores the burg to its ground state affiliation.
No more console errors when interacting with state hover/pin around the Sky Realm.
Potential Impacts

Land route generation may produce additional roads because sky-ported (but ground) burgs are now included.
Diplomacy arrays gain a neutral column for the Sky Realm when first created (non-breaking, UI-aligned).
Test Plan

Set sky port on a ground burg: verify roads/trails remain; sea port and other features unaffected.
Toggle flying on: burg state switches to Sky Realm; cell remains with ground state; altitude defaults from #burgDefaultSkyAltitude; air routes generate.
Toggle flying off: burg state returns to the ground state; altitude row hides; routes regenerate.
Hover/fog/pin states with the editors open: no errors with Sky Realm selected or hovered.
Open Watabou (city generator) links:
Ground + sky port: uses ground settings (gates/roads/hubs/shanty allowed).
Flying: uses sky settings (no farms/gates/hub etc. as appropriate).
Files Changed

modules/routes-generator.js
modules/ui/burg-editor.js
modules/ui/burgs-overview.js
modules/ui/editors.js
modules/dynamic/editors/states-editor.js
modules/ui/diplomacy-editor.js
modules/ui/military-overview.js
index.html
2025-09-08 15:09:59 +01:00
.docker Containerized version (#639) 2021-07-13 18:42:28 +03:00
.github Add comprehensive GitHub Copilot instructions for Fantasy Map Generator (#1233) 2025-09-08 14:58:11 +01:00
.vscode v1.3.03a 2020-03-27 17:52:23 +03:00
charges feat: add new emblem charges 2023-10-30 22:27:25 +04:00
components Slider-input web component (#1109) 2024-08-22 13:35:36 +02:00
config central store for heightmap configs 2022-05-29 01:03:21 +03:00
heightmaps doc: update readme 2023-02-09 13:12:37 -08:00
images Fix: rework texture data format (#1017) 2023-11-19 14:43:56 +04:00
libs style: increase dialog buttons size 2024-12-16 14:30:11 +01:00
modules fix: sky port behavior, default sky altitude, Sky Realm robustness, and unfly state restore 2025-09-08 15:09:59 +01:00
qgis qgis additions 2025-09-02 14:10:23 +01:00
styles sky-burgs-sky-routes 2025-09-05 21:07:42 +01:00
utils efficiency 2025-09-04 10:13:01 +01:00
.gitignore Add procedural directory to gitignore 2025-08-15 14:16:35 +01:00
CODE_OF_CONDUCT.md docs: code of conduct 2022-06-01 15:08:20 -07:00
Dockerfile Containerized version (#639) 2021-07-13 18:42:28 +03:00
dropbox.html dropbox - load script dynamically 2022-02-08 00:47:17 +03:00
icons.css AI generation for notes (#1112) 2024-08-23 18:08:50 +02:00
index.css fix: grid layer to not be clickable 2025-03-09 13:29:45 +01:00
index.html fix: sky port behavior, default sky altitude, Sky Realm robustness, and unfly state restore 2025-09-08 15:09:59 +01:00
ISSUE_TEMPLATE.md Update ISSUE_TEMPLATE.md 2018-06-11 21:36:07 +03:00
LICENSE Update LICENSE to include permission for derivative works 2024-06-29 12:03:52 +02:00
main.js Sky burgs + air routes: layer, editor toggles, styling, altitude, icons, and generators 2025-09-08 15:05:41 +01:00
manifest.webmanifest Correct name and shortname in web manifest (#912) 2023-01-09 01:03:23 -08:00
medievil+population_research.md Fix population aggregation system to eliminate double-counting 2025-08-13 18:54:32 +01:00
package-lock.json Fix population aggregation system to eliminate double-counting 2025-08-13 18:54:32 +01:00
package.json Fix population aggregation system to eliminate double-counting 2025-08-13 18:54:32 +01:00
population_alteration.md Add comprehensive population scaling documentation 2025-08-13 08:05:19 +01:00
QGIS Style Conversion from Fantasy Map.md Enhance population counting accuracy and add comprehensive geoJSON exports 2025-08-15 19:00:03 +01:00
README.md chore: update readme 2024-03-14 11:30:21 +01:00
run_php_server.bat BAT-file for run PHP built-in server (#1094) 2024-07-11 13:46:26 +02:00
run_python_server.bat qgis additions 2025-09-02 14:10:23 +01:00
run_python_server.sh efficiency 2025-09-04 10:13:01 +01:00
skyports.md sky-burgs-sky-routes 2025-09-05 21:07:42 +01:00
sw.js fix: service worker fn 2024-09-20 15:40:10 +02:00
TODO.md qgis additions 2025-09-02 14:10:23 +01:00
Tourland Markers 2025-09-02-10-19.geojson qgis additions 2025-09-02 14:10:23 +01:00
Unified Medieval Population and Route Plan.md Fix population aggregation system to eliminate double-counting 2025-08-13 18:54:32 +01:00
versioning.js fix: sky port behavior, default sky altitude, Sky Realm robustness, and unfly state restore 2025-09-08 15:09:59 +01:00

Fantasy Map Generator

Azgaar's Fantasy Map Generator is a free web application that helps fantasy writers, game masters, and cartographers create and edit fantasy maps.

Link: azgaar.github.io/Fantasy-Map-Generator.

Refer to the project wiki for guidance. The current progress is tracked in Trello. Some details are covered in my old blog Fantasy Maps for fun and glory.

preview

preview

preview

Join our Discord server and Reddit community to share your creations, discuss the Generator, suggest ideas and get the most recent updates.

Contact me via email if you have non-public suggestions. For bug reports please use GitHub issues or #fmg-bugs channel on Discord. If you are facing performance issues, please read the tips.

Pull requests are highly welcomed. The codebase is messy and requires re-design. I will appreciate if you start with minor changes. Check out the data model before contributing.

You can support the project on Patreon.

Inspiration: