mirror of
https://github.com/Azgaar/Fantasy-Map-Generator.git
synced 2025-12-16 17:31:24 +01:00
Merge pull request #3 from LeieSistal/claude/wiki-documentation-011CUoYyiWtfJYz6L1LGuHey
Add comprehensive wiki documentation
This commit is contained in:
commit
fd44e076ae
8 changed files with 4716 additions and 0 deletions
461
wiki/Architecture.md
Normal file
461
wiki/Architecture.md
Normal file
|
|
@ -0,0 +1,461 @@
|
|||
# System Architecture
|
||||
|
||||
This document describes the high-level architecture of the Fantasy Map Generator, including its design patterns, component organization, and key technical decisions.
|
||||
|
||||
## Overview
|
||||
|
||||
The Fantasy Map Generator is a client-side web application built with vanilla JavaScript. It uses a modular architecture where each major feature is encapsulated in its own module, communicating through shared global state objects.
|
||||
|
||||
## Architecture Diagram
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ index.html │
|
||||
│ (Main Entry Point) │
|
||||
└────────────────────────┬────────────────────────────────────┘
|
||||
│
|
||||
┌────────────────┼────────────────┐
|
||||
│ │ │
|
||||
▼ ▼ ▼
|
||||
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
|
||||
│ main.js │ │ versioning.js│ │ index.css │
|
||||
│ (Core Logic) │ │(Version Mgmt)│ │ (Styles) │
|
||||
└──────┬───────┘ └──────────────┘ └──────────────┘
|
||||
│
|
||||
│ Loads & Coordinates
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ modules/ │
|
||||
│ ┌────────────────┬────────────────┬─────────────────┐ │
|
||||
│ │ Generators │ Renderers │ UI │ │
|
||||
│ │ │ │ │ │
|
||||
│ │ • heightmap │ • coa-renderer │ • editors/ (41) │ │
|
||||
│ │ • rivers │ • relief-icons │ • dialogs │ │
|
||||
│ │ • cultures │ • ocean-layers │ • tools │ │
|
||||
│ │ • burgs/states │ │ │ │
|
||||
│ │ • religions │ │ │ │
|
||||
│ │ • routes │ │ │ │
|
||||
│ │ • military │ │ │ │
|
||||
│ │ • markers │ │ │ │
|
||||
│ │ • names │ │ │ │
|
||||
│ │ • coa │ │ │ │
|
||||
│ │ • biomes │ │ │ │
|
||||
│ └────────────────┴────────────────┴─────────────────┘ │
|
||||
│ ┌────────────────┬────────────────┐ │
|
||||
│ │ I/O │ Dynamic │ │
|
||||
│ │ • save/load │ • editors │ │
|
||||
│ │ • export │ • utilities │ │
|
||||
│ └────────────────┴────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
│
|
||||
│ Uses
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ libs/ │
|
||||
│ • d3.min.js (Data visualization & SVG) │
|
||||
│ • delaunator.min.js (Delaunay triangulation) │
|
||||
│ • jquery.min.js (DOM manipulation) │
|
||||
│ • jquery-ui.min.js (UI widgets) │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
│
|
||||
│ Manipulates
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ Global State │
|
||||
│ • grid (Voronoi diagram + terrain data) │
|
||||
│ • pack (Civilizations + derived data) │
|
||||
│ • seed (Random seed) │
|
||||
│ • options (Generation parameters) │
|
||||
│ • notes (User annotations) │
|
||||
│ • mapHistory (Undo/redo state) │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
│
|
||||
│ Renders to
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ SVG Canvas │
|
||||
│ 30+ layered groups for different map elements │
|
||||
│ (oceans, terrain, rivers, borders, labels, etc.) │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Core Components
|
||||
|
||||
### 1. Entry Point (index.html + main.js)
|
||||
|
||||
**index.html** serves as the application shell, containing:
|
||||
- SVG canvas with ~30 layered groups (see SVG Layer Structure below)
|
||||
- UI controls and dialogs
|
||||
- Script includes for libraries and modules
|
||||
|
||||
**main.js** (67KB+) is the application core, containing:
|
||||
- Initialization and bootstrapping logic
|
||||
- Main generation workflow (`generate()` function)
|
||||
- Global state management
|
||||
- Event handlers and UI coordination
|
||||
- Utility functions used throughout the app
|
||||
|
||||
### 2. Module Organization
|
||||
|
||||
All modules follow the **Revealing Module Pattern**:
|
||||
|
||||
```javascript
|
||||
window.ModuleName = (function() {
|
||||
// Private variables and functions
|
||||
const privateData = {};
|
||||
|
||||
function privateFunction() {
|
||||
// Implementation
|
||||
}
|
||||
|
||||
// Public API
|
||||
function publicFunction() {
|
||||
// Implementation
|
||||
}
|
||||
|
||||
return {
|
||||
publicFunction
|
||||
};
|
||||
})();
|
||||
```
|
||||
|
||||
This provides:
|
||||
- **Encapsulation** - Private implementation details
|
||||
- **Namespace management** - Clean global scope
|
||||
- **Explicit interfaces** - Clear public APIs
|
||||
|
||||
### 3. Module Categories
|
||||
|
||||
#### Generators (`modules/`)
|
||||
|
||||
These modules create map data procedurally:
|
||||
|
||||
- **heightmap-generator.js** - Terrain elevation using templates or images
|
||||
- **river-generator.js** - Water flow simulation and river networks
|
||||
- **cultures-generator.js** - Culture placement and expansion
|
||||
- **burgs-and-states.js** - Capitals, towns, and political boundaries
|
||||
- **religions-generator.js** - Religion creation and spread
|
||||
- **routes-generator.js** - Road and trade route networks
|
||||
- **military-generator.js** - Military units and regiments
|
||||
- **markers-generator.js** - Map markers and POIs
|
||||
- **names-generator.js** - Procedural name generation using Markov chains
|
||||
- **coa-generator.js** - Coat of arms generation
|
||||
- **biomes.js** - Biome assignment based on climate
|
||||
- **lakes.js** - Lake creation and management
|
||||
|
||||
#### Renderers (`modules/renderers/`)
|
||||
|
||||
These modules handle visualization:
|
||||
|
||||
- **coa-renderer.js** - Renders coats of arms to SVG
|
||||
- **relief-icons.js** - Terrain icon rendering
|
||||
- **ocean-layers.js** - Ocean visualization
|
||||
|
||||
#### UI Modules (`modules/ui/`)
|
||||
|
||||
41+ specialized editors, including:
|
||||
- Heightmap editor, coastline editor, rivers editor
|
||||
- Biomes editor, relief editor, temperature/precipitation graphs
|
||||
- Burg editor, states editor, cultures editor, religions editor
|
||||
- Provinces editor, routes editor, military overview
|
||||
- Markers editor, notes editor, zones editor
|
||||
- Style editors, options editor, tools
|
||||
|
||||
Each editor is a separate file that creates a dialog interface for editing specific map aspects.
|
||||
|
||||
#### I/O Modules (`modules/io/`)
|
||||
|
||||
Handle data persistence and export:
|
||||
- Save/load functionality (.map format)
|
||||
- Export to various formats (JSON, SVG, PNG, etc.)
|
||||
- Cloud storage integration
|
||||
|
||||
#### Dynamic Modules (`modules/dynamic/`)
|
||||
|
||||
Runtime utilities and helpers loaded dynamically as needed.
|
||||
|
||||
### 4. SVG Layer Structure
|
||||
|
||||
The map is rendered to an SVG canvas with ~30 named groups, organized by z-index:
|
||||
|
||||
```xml
|
||||
<svg id="map">
|
||||
<!-- Background -->
|
||||
<g id="oceanLayers"></g>
|
||||
<g id="oceanPattern"></g>
|
||||
|
||||
<!-- Terrain -->
|
||||
<g id="landmass"></g>
|
||||
<g id="texture"></g>
|
||||
<g id="terrs"></g>
|
||||
<g id="biomes"></g>
|
||||
|
||||
<!-- Water Features -->
|
||||
<g id="ice"></g>
|
||||
<g id="lakes"></g>
|
||||
<g id="coastline"></g>
|
||||
<g id="rivers"></g>
|
||||
|
||||
<!-- Political Boundaries -->
|
||||
<g id="regions"></g>
|
||||
<g id="statesBody"></g>
|
||||
<g id="statesHalo"></g>
|
||||
<g id="provs"></g>
|
||||
<g id="borders"></g>
|
||||
|
||||
<!-- Population & Infrastructure -->
|
||||
<g id="zones"></g>
|
||||
<g id="population"></g>
|
||||
<g id="routes"></g>
|
||||
<g id="roads"></g>
|
||||
<g id="trails"></g>
|
||||
<g id="searoutes"></g>
|
||||
|
||||
<!-- Settlements & Icons -->
|
||||
<g id="temp"></g>
|
||||
<g id="military"></g>
|
||||
<g id="icons"></g>
|
||||
<g id="burgIcons"></g>
|
||||
<g id="burgLabels"></g>
|
||||
|
||||
<!-- Information Layers -->
|
||||
<g id="labels"></g>
|
||||
<g id="markers"></g>
|
||||
<g id="prec"></g>
|
||||
<g id="temperature"></g>
|
||||
<g id="ruler"></g>
|
||||
<g id="grid"></g>
|
||||
<g id="coordinates"></g>
|
||||
<g id="compass"></g>
|
||||
<g id="legend"></g>
|
||||
|
||||
<!-- Overlays -->
|
||||
<g id="debug"></g>
|
||||
<g id="overlay"></g>
|
||||
</svg>
|
||||
```
|
||||
|
||||
Each layer can be toggled on/off independently. Elements are drawn to specific layers based on their type, allowing for proper z-ordering and selective rendering.
|
||||
|
||||
## Design Patterns
|
||||
|
||||
### 1. Global State Pattern
|
||||
|
||||
The application uses several global objects to store state:
|
||||
|
||||
```javascript
|
||||
// Main data structures
|
||||
let grid = {}; // Voronoi diagram + terrain
|
||||
let pack = {}; // Civilizations + derived data
|
||||
let seed = ""; // Random seed for reproducibility
|
||||
let options = {}; // Generation parameters
|
||||
|
||||
// Additional state
|
||||
let notes = []; // User annotations
|
||||
let mapHistory = []; // Undo/redo states
|
||||
let customization = 0; // Customization level
|
||||
```
|
||||
|
||||
**Benefits:**
|
||||
- Simple communication between modules
|
||||
- Easy serialization for save/load
|
||||
- No complex state management library needed
|
||||
|
||||
**Drawbacks:**
|
||||
- Global namespace pollution
|
||||
- Implicit dependencies between modules
|
||||
- Harder to reason about data flow
|
||||
|
||||
### 2. Typed Arrays for Performance
|
||||
|
||||
To handle large datasets efficiently, the application uses JavaScript Typed Arrays:
|
||||
|
||||
```javascript
|
||||
pack.cells = {
|
||||
i: new Uint32Array(cells), // Cell indices
|
||||
h: new Uint8Array(cells), // Height (0-255)
|
||||
s: new Uint16Array(cells), // State ID
|
||||
culture: new Uint16Array(cells), // Culture ID
|
||||
// ... etc
|
||||
}
|
||||
```
|
||||
|
||||
**Benefits:**
|
||||
- 50-90% memory reduction vs regular arrays
|
||||
- Faster iteration and access
|
||||
- Enforced data types prevent bugs
|
||||
|
||||
### 3. Seeded Random Generation
|
||||
|
||||
Uses **aleaPRNG** for reproducible randomness:
|
||||
|
||||
```javascript
|
||||
Math.random = aleaPRNG(seed);
|
||||
```
|
||||
|
||||
Any map can be regenerated identically using the same seed, enabling:
|
||||
- Sharing maps by seed string
|
||||
- Debugging reproducibility
|
||||
- Procedural generation consistency
|
||||
|
||||
### 4. Event-Driven UI Updates
|
||||
|
||||
UI editors trigger updates through event listeners:
|
||||
|
||||
```javascript
|
||||
$('#someInput').on('change', function() {
|
||||
updateMapElement();
|
||||
drawLayers();
|
||||
});
|
||||
```
|
||||
|
||||
Changes immediately reflect on the map, providing real-time feedback.
|
||||
|
||||
### 5. D3.js Data Binding
|
||||
|
||||
Uses D3.js for declarative data-to-DOM binding:
|
||||
|
||||
```javascript
|
||||
const cells = d3.select('#biomes').selectAll('polygon')
|
||||
.data(pack.cells.i.filter(i => pack.cells.h[i] >= 20))
|
||||
.enter().append('polygon')
|
||||
.attr('points', d => getCellPolygonPoints(d))
|
||||
.attr('fill', d => biomesData.color[pack.cells.biome[d]]);
|
||||
```
|
||||
|
||||
This pattern allows efficient updates when data changes.
|
||||
|
||||
## Data Flow
|
||||
|
||||
### Generation Pipeline
|
||||
|
||||
```
|
||||
User Input (seed, options)
|
||||
↓
|
||||
Generate Grid (Voronoi)
|
||||
↓
|
||||
Heightmap Generation
|
||||
↓
|
||||
Feature Detection (land/water)
|
||||
↓
|
||||
Climate Calculation (temp/prec)
|
||||
↓
|
||||
Repack Grid → Pack
|
||||
↓
|
||||
Rivers & Lakes
|
||||
↓
|
||||
Biome Assignment
|
||||
↓
|
||||
Culture Generation
|
||||
↓
|
||||
State Generation
|
||||
↓
|
||||
Settlement Generation
|
||||
↓
|
||||
Route Generation
|
||||
↓
|
||||
Rendering to SVG
|
||||
↓
|
||||
User Interaction (editing)
|
||||
```
|
||||
|
||||
### Edit-Render Cycle
|
||||
|
||||
```
|
||||
User Edits Data
|
||||
↓
|
||||
Update Global State (grid/pack)
|
||||
↓
|
||||
Trigger Render Function
|
||||
↓
|
||||
D3.js Updates SVG Elements
|
||||
↓
|
||||
Browser Renders Changes
|
||||
```
|
||||
|
||||
## Performance Considerations
|
||||
|
||||
### 1. Cell Count
|
||||
|
||||
Default: **~10,000 cells** in the grid
|
||||
- More cells = higher detail + slower generation
|
||||
- Fewer cells = lower detail + faster generation
|
||||
- Configurable in options
|
||||
|
||||
### 2. Rendering Optimization
|
||||
|
||||
- **Selective Layer Drawing** - Only redraw changed layers
|
||||
- **D3 Data Binding** - Efficient DOM updates
|
||||
- **Typed Arrays** - Memory-efficient storage
|
||||
- **Debounced Updates** - Prevent excessive redraws during editing
|
||||
|
||||
### 3. Lazy Loading
|
||||
|
||||
Some modules are loaded on-demand:
|
||||
- 3D view components
|
||||
- Export utilities
|
||||
- Advanced editors
|
||||
|
||||
## Technology Stack
|
||||
|
||||
### Core Technologies
|
||||
|
||||
- **JavaScript (ES6+)** - Core language
|
||||
- **SVG** - Vector graphics rendering
|
||||
- **HTML5 Canvas** - Some bitmap operations
|
||||
- **CSS3** - Styling and layout
|
||||
|
||||
### Key Libraries
|
||||
|
||||
| Library | Version | Purpose |
|
||||
|---------|---------|---------|
|
||||
| **D3.js** | v7+ | Data visualization, SVG manipulation |
|
||||
| **Delaunator** | Latest | Fast Delaunay triangulation |
|
||||
| **jQuery** | 3.x | DOM manipulation, AJAX |
|
||||
| **jQuery UI** | 1.x | Dialogs, sliders, sortable |
|
||||
|
||||
### Algorithms & Techniques
|
||||
|
||||
- **Voronoi Diagrams** - Spatial partitioning for cells
|
||||
- **Delaunay Triangulation** - Dual graph for Voronoi
|
||||
- **Markov Chains** - Procedural name generation
|
||||
- **Heightmap Templates** - Terrain generation patterns
|
||||
- **Flux-based River Simulation** - Realistic water flow
|
||||
- **Expansion Algorithms** - Culture and state growth
|
||||
- **Dijkstra's Algorithm** - Route pathfinding
|
||||
|
||||
## Browser Compatibility
|
||||
|
||||
**Recommended:** Modern evergreen browsers
|
||||
- Chrome/Edge (Chromium) - Best performance
|
||||
- Firefox - Good performance
|
||||
- Safari - Good performance
|
||||
|
||||
**Required Features:**
|
||||
- ES6 JavaScript support
|
||||
- SVG 1.1
|
||||
- Canvas API
|
||||
- Local Storage API
|
||||
- File API for save/load
|
||||
|
||||
## Deployment
|
||||
|
||||
The application is:
|
||||
- **Static** - No server-side processing required
|
||||
- **Client-side** - Runs entirely in the browser
|
||||
- **Portable** - Can run from local filesystem or any web server
|
||||
- **GitHub Pages** - Official deployment at azgaar.github.io
|
||||
|
||||
## Future Architecture Considerations
|
||||
|
||||
The codebase is acknowledged to be "messy and requires re-design" (per README). Potential improvements:
|
||||
|
||||
1. **Module Bundling** - Use webpack/rollup for better dependency management
|
||||
2. **State Management** - Consider Redux/MobX for clearer data flow
|
||||
3. **TypeScript** - Type safety and better IDE support
|
||||
4. **Component Framework** - Vue/React for more maintainable UI
|
||||
5. **Web Workers** - Offload heavy generation to background threads
|
||||
6. **WASM** - Performance-critical sections in Rust/C++
|
||||
|
||||
However, the current architecture works well for its purpose and maintains accessibility for contributors familiar with vanilla JavaScript.
|
||||
630
wiki/Data-Model.md
Normal file
630
wiki/Data-Model.md
Normal file
|
|
@ -0,0 +1,630 @@
|
|||
# Data Model
|
||||
|
||||
This document describes the data structures used by the Fantasy Map Generator. Understanding these structures is essential for contributing to the project or building extensions.
|
||||
|
||||
## Overview
|
||||
|
||||
The generator maintains two primary data structures:
|
||||
|
||||
1. **`grid`** - The initial Voronoi diagram with terrain and climate data
|
||||
2. **`pack`** - A packed/filtered version with civilizations and derived features
|
||||
|
||||
Both are global objects accessible throughout the application. All map data can be serialized to/from these structures for save/load functionality.
|
||||
|
||||
## Grid Object
|
||||
|
||||
The `grid` object represents the initial Voronoi diagram created from ~10,000 jittered points. It contains the raw terrain and climate data.
|
||||
|
||||
### Structure
|
||||
|
||||
```javascript
|
||||
grid = {
|
||||
// Core Voronoi data
|
||||
points: [[x1, y1], [x2, y2], ...], // Array of [x, y] coordinates
|
||||
cells: {
|
||||
i: Uint32Array, // Cell indices [0, 1, 2, ...]
|
||||
v: Array, // Vertices indices for each cell
|
||||
c: Array, // Adjacent cell indices
|
||||
b: Uint8Array, // Border cell (1) or not (0)
|
||||
f: Uint16Array, // Feature ID (island/ocean/lake)
|
||||
t: Int8Array, // Cell type: -1=ocean, -2=lake, 1=land
|
||||
h: Uint8Array, // Height (0-100, where 20 is sea level)
|
||||
temp: Int8Array, // Temperature (-128 to 127)
|
||||
prec: Uint8Array, // Precipitation (0-255)
|
||||
area: Float32Array, // Cell area in square pixels
|
||||
},
|
||||
|
||||
// Vertices
|
||||
vertices: {
|
||||
p: [[x, y], ...], // Vertex coordinates
|
||||
v: Array, // Voronoi vertices
|
||||
c: Array // Adjacent cells to each vertex
|
||||
},
|
||||
|
||||
// Seeds (feature centers)
|
||||
seeds: {
|
||||
i: Uint16Array, // Seed cell indices
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Key Properties
|
||||
|
||||
#### cells.i (Index)
|
||||
- Unique identifier for each cell
|
||||
- Values: `0` to `n-1` where `n` is cell count
|
||||
- Used to reference cells throughout the application
|
||||
|
||||
#### cells.h (Height)
|
||||
- Elevation value for the cell
|
||||
- Range: `0-100` (typically)
|
||||
- Convention: `0-20` = water, `20+` = land
|
||||
- Higher values = higher elevation
|
||||
|
||||
#### cells.temp (Temperature)
|
||||
- Temperature in relative units
|
||||
- Range: `-128` to `127` (signed 8-bit)
|
||||
- Calculated based on latitude and other factors
|
||||
- Affects biome assignment
|
||||
|
||||
#### cells.prec (Precipitation)
|
||||
- Rainfall/moisture level
|
||||
- Range: `0-255` (unsigned 8-bit)
|
||||
- Affects river generation and biomes
|
||||
- Higher near coasts and prevailing winds
|
||||
|
||||
#### cells.f (Feature ID)
|
||||
- Identifies which landmass/ocean/lake the cell belongs to
|
||||
- Each contiguous land area gets a unique ID
|
||||
- Used for island detection and feature management
|
||||
|
||||
#### cells.t (Type)
|
||||
- Quick type classification
|
||||
- Values: `-2` = lake, `-1` = ocean, `0` = coast, `1` = land
|
||||
- Used for filtering and quick checks
|
||||
|
||||
### Grid Methods
|
||||
|
||||
The grid doesn't expose many methods directly. Most operations are performed by utility functions in `main.js`:
|
||||
|
||||
```javascript
|
||||
// Generate initial grid
|
||||
generateGrid();
|
||||
|
||||
// Get neighboring cells
|
||||
const neighbors = grid.cells.c[cellId];
|
||||
|
||||
// Check if cell is land
|
||||
const isLand = grid.cells.h[cellId] >= 20;
|
||||
```
|
||||
|
||||
## Pack Object
|
||||
|
||||
The `pack` object is derived from `grid` after initial generation. It contains only land cells and adds civilization data.
|
||||
|
||||
### Structure
|
||||
|
||||
```javascript
|
||||
pack = {
|
||||
// Cell data (filtered from grid, only land cells)
|
||||
cells: {
|
||||
i: Uint32Array, // Cell indices
|
||||
p: Array, // [x, y] coordinates
|
||||
v: Array, // Vertex indices
|
||||
c: Array, // Adjacent cells
|
||||
area: Float32Array, // Cell area
|
||||
|
||||
// Terrain data (from grid)
|
||||
h: Uint8Array, // Height
|
||||
temp: Int8Array, // Temperature
|
||||
prec: Uint8Array, // Precipitation
|
||||
|
||||
// Water features
|
||||
r: Uint16Array, // River ID (0 = no river)
|
||||
fl: Uint16Array, // Water flux (amount of water flowing)
|
||||
conf: Uint8Array, // River confluence count
|
||||
|
||||
// Biomes & terrain
|
||||
biome: Uint8Array, // Biome type ID
|
||||
|
||||
// Civilization
|
||||
s: Uint16Array, // State ID (0 = neutral)
|
||||
culture: Uint16Array, // Culture ID
|
||||
religion: Uint16Array, // Religion ID (0 = no religion)
|
||||
province: Uint16Array, // Province ID
|
||||
burg: Uint16Array, // Burg ID (0 = no settlement)
|
||||
|
||||
// Infrastructure
|
||||
road: Uint16Array, // Road power (0 = no road)
|
||||
crossroad: Uint16Array, // Crossroad value
|
||||
|
||||
// Derived properties
|
||||
pop: Float32Array, // Population density
|
||||
harbor: Uint8Array, // Harbor/port status
|
||||
},
|
||||
|
||||
// Vertices
|
||||
vertices: {
|
||||
p: Array, // [x, y] coordinates
|
||||
c: Array, // Adjacent cells
|
||||
v: Array // Voronoi data
|
||||
},
|
||||
|
||||
// Burgs (settlements)
|
||||
burgs: [
|
||||
{
|
||||
i: Number, // Unique ID
|
||||
cell: Number, // Cell index where burg is located
|
||||
x: Number, // X coordinate
|
||||
y: Number, // Y coordinate
|
||||
name: String, // Settlement name
|
||||
feature: Number, // Feature (island) ID
|
||||
|
||||
// Political
|
||||
state: Number, // State ID
|
||||
capital: Boolean, // Is state capital
|
||||
|
||||
// Cultural
|
||||
culture: Number, // Culture ID
|
||||
|
||||
// Population
|
||||
population: Number, // Total population
|
||||
type: String, // Settlement type (city, town, etc.)
|
||||
|
||||
// Other
|
||||
port: Number, // Port/harbor value
|
||||
citadel: Boolean, // Has citadel/castle
|
||||
}
|
||||
],
|
||||
|
||||
// States (political entities)
|
||||
states: [
|
||||
{
|
||||
i: Number, // Unique ID (0 = neutral)
|
||||
name: String, // State name
|
||||
color: String, // CSS color code
|
||||
capital: Number, // Capital burg ID
|
||||
|
||||
// Cultural
|
||||
culture: Number, // Dominant culture ID
|
||||
religion: Number, // State religion ID
|
||||
|
||||
// Political
|
||||
type: String, // Government type (Kingdom, Empire, etc.)
|
||||
expansionism: Number, // Expansion aggressiveness (0-1)
|
||||
form: String, // "Monarchy", "Republic", etc.
|
||||
|
||||
// Geographic
|
||||
area: Number, // Total area in cells
|
||||
cells: Number, // Number of cells
|
||||
|
||||
// Population
|
||||
rural: Number, // Rural population
|
||||
urban: Number, // Urban population
|
||||
|
||||
// Military
|
||||
military: Array, // Military units
|
||||
|
||||
// Diplomacy
|
||||
diplomacy: Array, // Relations with other states
|
||||
|
||||
// Other
|
||||
pole: [x, y], // Pole of inaccessibility (label position)
|
||||
alert: Number, // Alert level
|
||||
alive: Number, // Is state alive (1) or removed (0)
|
||||
}
|
||||
],
|
||||
|
||||
// Cultures
|
||||
cultures: [
|
||||
{
|
||||
i: Number, // Unique ID
|
||||
name: String, // Culture name
|
||||
base: Number, // Base name generation set
|
||||
type: String, // Culture type (Generic, River, etc.)
|
||||
|
||||
// Geographic
|
||||
center: Number, // Origin cell
|
||||
color: String, // CSS color code
|
||||
|
||||
// Area & population
|
||||
area: Number, // Total area
|
||||
cells: Number, // Number of cells
|
||||
rural: Number, // Rural population
|
||||
urban: Number, // Urban population
|
||||
|
||||
// Cultural traits
|
||||
expansionism: Number, // Expansion rate
|
||||
shield: String, // Shield shape for CoA
|
||||
code: String, // Two-letter code
|
||||
}
|
||||
],
|
||||
|
||||
// Religions
|
||||
religions: [
|
||||
{
|
||||
i: Number, // Unique ID (0 = no religion)
|
||||
name: String, // Religion name
|
||||
color: String, // CSS color code
|
||||
type: String, // Religion type (Folk, Organized, etc.)
|
||||
form: String, // Form (Cult, Church, etc.)
|
||||
|
||||
// Origins
|
||||
culture: Number, // Origin culture ID
|
||||
center: Number, // Origin cell
|
||||
|
||||
// Geographic
|
||||
area: Number, // Total area
|
||||
cells: Number, // Number of cells
|
||||
rural: Number, // Rural population
|
||||
urban: Number, // Urban population
|
||||
|
||||
// Deities & beliefs
|
||||
deity: String, // Deity name (if applicable)
|
||||
expansion: String, // Expansion strategy
|
||||
expansionism: Number, // Expansion rate
|
||||
code: String, // Two-letter code
|
||||
}
|
||||
],
|
||||
|
||||
// Rivers
|
||||
rivers: [
|
||||
{
|
||||
i: Number, // Unique ID
|
||||
source: Number, // Source cell
|
||||
mouth: Number, // Mouth cell
|
||||
cells: Array, // Array of cell indices along river
|
||||
length: Number, // River length
|
||||
width: Number, // River width
|
||||
name: String, // River name
|
||||
type: String, // River type
|
||||
parent: Number, // Parent river (for tributaries)
|
||||
}
|
||||
],
|
||||
|
||||
// Features (landmasses, oceans, lakes)
|
||||
features: [
|
||||
{
|
||||
i: Number, // Unique ID
|
||||
land: Boolean, // Is land (true) or water (false)
|
||||
border: Boolean, // Touches map border
|
||||
type: String, // "island", "ocean", "lake"
|
||||
cells: Number, // Number of cells
|
||||
firstCell: Number, // First cell of feature
|
||||
group: String, // Group name (for islands)
|
||||
area: Number, // Total area
|
||||
height: Number, // Average height
|
||||
}
|
||||
],
|
||||
|
||||
// Provinces
|
||||
provinces: [
|
||||
{
|
||||
i: Number, // Unique ID
|
||||
state: Number, // State ID
|
||||
name: String, // Province name
|
||||
formName: String, // Form name (e.g., "Duchy of X")
|
||||
color: String, // CSS color code
|
||||
|
||||
// Capital
|
||||
burg: Number, // Capital burg ID
|
||||
center: Number, // Center cell
|
||||
|
||||
// Geography
|
||||
area: Number, // Total area
|
||||
cells: Number, // Number of cells
|
||||
|
||||
// Population
|
||||
rural: Number, // Rural population
|
||||
urban: Number, // Urban population
|
||||
|
||||
// Other
|
||||
pole: [x, y], // Label position
|
||||
}
|
||||
],
|
||||
|
||||
// Markers (map annotations)
|
||||
markers: [
|
||||
{
|
||||
i: Number, // Unique ID
|
||||
type: String, // Marker type (volcano, monument, etc.)
|
||||
x: Number, // X coordinate
|
||||
y: Number, // Y coordinate
|
||||
cell: Number, // Cell index
|
||||
icon: String, // Icon identifier
|
||||
size: Number, // Icon size
|
||||
note: String, // Associated note text
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Biomes Data
|
||||
|
||||
The `biomesData` object defines biome properties:
|
||||
|
||||
```javascript
|
||||
biomesData = {
|
||||
i: [id0, id1, ...], // Biome IDs
|
||||
name: [...], // Human-readable names
|
||||
color: [...], // Display colors
|
||||
habitability: [...], // How suitable for settlements (0-100)
|
||||
iconsDensity: [...], // Density of relief icons
|
||||
icons: [...], // Icon sets to use
|
||||
cost: [...], // Movement cost multiplier
|
||||
biomesMartix: [...] // Temperature/precipitation mapping
|
||||
}
|
||||
```
|
||||
|
||||
### Standard Biomes
|
||||
|
||||
| ID | Name | Description |
|
||||
|----|------|-------------|
|
||||
| 1 | Marine | Ocean biome |
|
||||
| 2 | Hot desert | Arid, hot regions |
|
||||
| 3 | Cold desert | Arid, cold regions |
|
||||
| 4 | Savanna | Grasslands with scattered trees |
|
||||
| 5 | Grassland | Temperate grasslands |
|
||||
| 6 | Tropical seasonal forest | Wet/dry tropical forest |
|
||||
| 7 | Temperate deciduous forest | Moderate climate forests |
|
||||
| 8 | Tropical rainforest | Dense, wet jungle |
|
||||
| 9 | Temperate rainforest | Wet coastal forests |
|
||||
| 10 | Taiga | Boreal forest |
|
||||
| 11 | Tundra | Treeless cold regions |
|
||||
| 12 | Glacier | Ice and snow |
|
||||
| 13 | Wetland | Marshes and swamps |
|
||||
|
||||
## Notes Data
|
||||
|
||||
User annotations stored separately:
|
||||
|
||||
```javascript
|
||||
notes = [
|
||||
{
|
||||
id: String, // Unique identifier
|
||||
name: String, // Note title
|
||||
legend: String, // Legend text
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
## Map History
|
||||
|
||||
Undo/redo system stores state snapshots:
|
||||
|
||||
```javascript
|
||||
mapHistory = [
|
||||
{
|
||||
json: String, // Serialized map state
|
||||
options: Object, // Generation options at time
|
||||
version: String // Generator version
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
## Data Relationships
|
||||
|
||||
### Cell → Civilization Hierarchy
|
||||
|
||||
```
|
||||
Cell (pack.cells.i[cellId])
|
||||
├─ Burg (pack.cells.burg[cellId] → pack.burgs[burgId])
|
||||
├─ State (pack.cells.s[cellId] → pack.states[stateId])
|
||||
├─ Culture (pack.cells.culture[cellId] → pack.cultures[cultureId])
|
||||
├─ Religion (pack.cells.religion[cellId] → pack.religions[religionId])
|
||||
└─ Province (pack.cells.province[cellId] → pack.provinces[provinceId])
|
||||
```
|
||||
|
||||
### State Hierarchy
|
||||
|
||||
```
|
||||
State (pack.states[stateId])
|
||||
├─ Capital Burg (pack.states[stateId].capital → pack.burgs[burgId])
|
||||
├─ Culture (pack.states[stateId].culture → pack.cultures[cultureId])
|
||||
├─ Religion (pack.states[stateId].religion → pack.religions[religionId])
|
||||
├─ Provinces (pack.provinces.filter(p => p.state === stateId))
|
||||
└─ Burgs (pack.burgs.filter(b => b.state === stateId))
|
||||
```
|
||||
|
||||
### River Network
|
||||
|
||||
```
|
||||
River (pack.rivers[riverId])
|
||||
├─ Source Cell (pack.rivers[riverId].source)
|
||||
├─ Mouth Cell (pack.rivers[riverId].mouth)
|
||||
├─ Path Cells (pack.rivers[riverId].cells[])
|
||||
└─ Parent River (pack.rivers[riverId].parent for tributaries)
|
||||
```
|
||||
|
||||
## Data Access Patterns
|
||||
|
||||
### Finding data for a cell
|
||||
|
||||
```javascript
|
||||
// Given a cell index
|
||||
const cellId = 1234;
|
||||
|
||||
// Get basic terrain
|
||||
const height = pack.cells.h[cellId];
|
||||
const temperature = pack.cells.temp[cellId];
|
||||
const biome = pack.cells.biome[cellId];
|
||||
|
||||
// Get civilization
|
||||
const stateId = pack.cells.s[cellId];
|
||||
const cultureId = pack.cells.culture[cellId];
|
||||
const burgId = pack.cells.burg[cellId];
|
||||
|
||||
// Get full objects
|
||||
const state = pack.states[stateId];
|
||||
const culture = pack.cultures[cultureId];
|
||||
const burg = pack.burgs[burgId];
|
||||
```
|
||||
|
||||
### Finding all cells for an entity
|
||||
|
||||
```javascript
|
||||
// All cells belonging to a state
|
||||
const stateCells = pack.cells.i.filter(i => pack.cells.s[i] === stateId);
|
||||
|
||||
// All cells with a specific biome
|
||||
const biomeCells = pack.cells.i.filter(i => pack.cells.biome[i] === biomeId);
|
||||
|
||||
// All cells with rivers
|
||||
const riverCells = pack.cells.i.filter(i => pack.cells.r[i] > 0);
|
||||
```
|
||||
|
||||
### Iterating efficiently
|
||||
|
||||
```javascript
|
||||
// Using typed arrays directly (fastest)
|
||||
for (let i = 0; i < pack.cells.i.length; i++) {
|
||||
const cellId = pack.cells.i[i];
|
||||
const height = pack.cells.h[i];
|
||||
// Process cell...
|
||||
}
|
||||
|
||||
// Using filter + map (more readable)
|
||||
const mountainCells = pack.cells.i
|
||||
.filter(i => pack.cells.h[i] > 70)
|
||||
.map(i => ({
|
||||
id: i,
|
||||
x: pack.cells.p[i][0],
|
||||
y: pack.cells.p[i][1]
|
||||
}));
|
||||
```
|
||||
|
||||
## Serialization
|
||||
|
||||
### Save Format
|
||||
|
||||
Maps are saved as JSON with the following structure:
|
||||
|
||||
```javascript
|
||||
{
|
||||
info: {
|
||||
version: String, // Generator version
|
||||
description: String, // Map description
|
||||
exportedAt: String, // Timestamp
|
||||
mapName: String, // Map name
|
||||
width: Number, // Map width
|
||||
height: Number, // Map height
|
||||
seed: String // Random seed
|
||||
},
|
||||
settings: {}, // Generation options
|
||||
mapCoordinates: {}, // Coordinate system
|
||||
grid: {}, // Grid data
|
||||
pack: {}, // Pack data
|
||||
biomesData: {}, // Biome definitions
|
||||
notes: [], // User notes
|
||||
nameBases: [] // Name generation data
|
||||
}
|
||||
```
|
||||
|
||||
### Load Process
|
||||
|
||||
When loading a map:
|
||||
1. Parse JSON
|
||||
2. Restore typed arrays from regular arrays
|
||||
3. Run version migration if needed (via `versioning.js`)
|
||||
4. Restore global state
|
||||
5. Regenerate derived data if necessary
|
||||
6. Render to SVG
|
||||
|
||||
## Performance Considerations
|
||||
|
||||
### Memory Usage
|
||||
|
||||
Typed arrays provide significant memory savings:
|
||||
- `Uint8Array`: 1 byte per element (0-255)
|
||||
- `Uint16Array`: 2 bytes per element (0-65,535)
|
||||
- `Int8Array`: 1 byte per element (-128-127)
|
||||
- `Float32Array`: 4 bytes per element
|
||||
|
||||
For 10,000 cells:
|
||||
- Regular array: ~80 KB per property
|
||||
- Uint8Array: ~10 KB per property
|
||||
- **80-90% memory reduction**
|
||||
|
||||
### Access Speed
|
||||
|
||||
Typed arrays provide:
|
||||
- Faster iteration (predictable memory layout)
|
||||
- Better cache utilization
|
||||
- Optimized by JavaScript engines
|
||||
|
||||
### Trade-offs
|
||||
|
||||
**Pros:**
|
||||
- Excellent memory efficiency
|
||||
- Fast array operations
|
||||
- Type safety for numeric data
|
||||
|
||||
**Cons:**
|
||||
- Less flexible than objects
|
||||
- Parallel arrays can be confusing
|
||||
- Requires index synchronization
|
||||
|
||||
## Extending the Data Model
|
||||
|
||||
When adding new data:
|
||||
|
||||
1. **Choose the right location**
|
||||
- Cell-level: Add to `pack.cells.*`
|
||||
- Entity-level: Add new array like `pack.newEntities[]`
|
||||
|
||||
2. **Use appropriate types**
|
||||
- IDs: Uint16Array or Uint32Array
|
||||
- Small numbers: Uint8Array or Int8Array
|
||||
- Decimals: Float32Array
|
||||
- Strings/objects: Regular arrays
|
||||
|
||||
3. **Update serialization**
|
||||
- Add to save format
|
||||
- Add to load process
|
||||
- Handle versioning in `versioning.js`
|
||||
|
||||
4. **Consider relationships**
|
||||
- How does it relate to existing data?
|
||||
- What indices/lookups are needed?
|
||||
- How will it be queried?
|
||||
|
||||
### Example: Adding a new cell property
|
||||
|
||||
```javascript
|
||||
// 1. Add to pack.cells
|
||||
pack.cells.myProperty = new Uint8Array(pack.cells.i.length);
|
||||
|
||||
// 2. Initialize during generation
|
||||
function generateMyProperty() {
|
||||
for (let i = 0; i < pack.cells.i.length; i++) {
|
||||
pack.cells.myProperty[i] = calculateValue(i);
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Update save/load
|
||||
function saveMap() {
|
||||
const data = {
|
||||
// ... existing data
|
||||
myProperty: Array.from(pack.cells.myProperty)
|
||||
};
|
||||
}
|
||||
|
||||
function loadMap(data) {
|
||||
// ... load other data
|
||||
pack.cells.myProperty = new Uint8Array(data.myProperty);
|
||||
}
|
||||
|
||||
// 4. Use in rendering/editing
|
||||
function renderMyProperty() {
|
||||
d3.select('#myLayer').selectAll('path')
|
||||
.data(pack.cells.i)
|
||||
.attr('fill', i => getColor(pack.cells.myProperty[i]));
|
||||
}
|
||||
```
|
||||
|
||||
## Reference Documentation
|
||||
|
||||
For more details on specific aspects:
|
||||
- [Architecture](Architecture.md) - System design and patterns
|
||||
- [Generation Process](Generation-Process.md) - How data is created
|
||||
- [Modules Reference](Modules-Reference.md) - Module APIs
|
||||
911
wiki/Features-and-UI.md
Normal file
911
wiki/Features-and-UI.md
Normal file
|
|
@ -0,0 +1,911 @@
|
|||
# Features and User Interface
|
||||
|
||||
This document describes all features available in the Fantasy Map Generator and how to use the user interface.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
1. [Main Interface](#main-interface)
|
||||
2. [Generation Features](#generation-features)
|
||||
3. [Editing Features](#editing-features)
|
||||
4. [Visualization Features](#visualization-features)
|
||||
5. [Export and Save Features](#export-and-save-features)
|
||||
6. [Advanced Features](#advanced-features)
|
||||
|
||||
---
|
||||
|
||||
## Main Interface
|
||||
|
||||
### Map Canvas
|
||||
|
||||
The central SVG canvas displays your generated map with multiple layers:
|
||||
|
||||
**Layer Controls:**
|
||||
- Toggle layers on/off using toolbar buttons
|
||||
- Adjust layer opacity
|
||||
- Reorder layers (z-index)
|
||||
|
||||
**Interaction:**
|
||||
- **Pan**: Click and drag
|
||||
- **Zoom**: Mouse wheel or pinch gesture
|
||||
- **Select**: Click on elements to select
|
||||
- **Info**: Hover for tooltips
|
||||
|
||||
### Toolbar
|
||||
|
||||
Located at the top of the screen, provides quick access to:
|
||||
|
||||
**File Operations:**
|
||||
- New map
|
||||
- Open map
|
||||
- Save map
|
||||
- Export
|
||||
|
||||
**Tools:**
|
||||
- Edit mode toggle
|
||||
- Layer visibility
|
||||
- Zoom controls
|
||||
- Fullscreen
|
||||
|
||||
**Options:**
|
||||
- Generation options
|
||||
- Style settings
|
||||
- Editor access
|
||||
|
||||
### Tools Panel
|
||||
|
||||
Expandable side panel with:
|
||||
- Quick generation options
|
||||
- Layer toggles
|
||||
- Minimap
|
||||
- Statistics
|
||||
|
||||
---
|
||||
|
||||
## Generation Features
|
||||
|
||||
### Initial Map Generation
|
||||
|
||||
**Access:** File → Generate New Map
|
||||
|
||||
**Options:**
|
||||
|
||||
#### Seed Settings
|
||||
- **Seed**: Text string for reproducible generation
|
||||
- Leave blank for random
|
||||
- Share seeds to recreate maps
|
||||
- **Random Button**: Generate random seed
|
||||
|
||||
#### Template Selection
|
||||
- **Heightmap Template**: Choose terrain type
|
||||
- Pangea - Single large continent
|
||||
- Continents - Multiple landmasses
|
||||
- Archipelago - Many islands
|
||||
- Atoll - Ring-shaped coral island
|
||||
- Mediterranean - Central sea
|
||||
- Peninsula - Land projection
|
||||
- Isthmus - Narrow land bridge
|
||||
- Volcano - Volcanic island
|
||||
- High/Low Island - Island types
|
||||
- Custom - Upload your own heightmap image
|
||||
|
||||
#### World Settings
|
||||
- **Cell Count**: Map detail level (1,000 - 100,000)
|
||||
- Lower = faster, less detailed
|
||||
- Higher = slower, more detailed
|
||||
- Default: ~10,000
|
||||
- **Map Size**: Width and height in pixels
|
||||
- **Latitude**: North/south positioning (affects climate)
|
||||
|
||||
#### Culture Settings
|
||||
- **Culture Count**: Number of cultures (1-20)
|
||||
- **Name Bases**: Select language/naming styles
|
||||
|
||||
#### State Settings
|
||||
- **State Count**: Number of political entities
|
||||
- **Expansionism**: How aggressively states expand
|
||||
- **Neutral Lands**: Percentage of unclaimed territory
|
||||
|
||||
#### Population Settings
|
||||
- **Urban Density**: Frequency of cities/towns
|
||||
- **Rural Density**: Population distribution
|
||||
- **Urban Growth**: City size multiplier
|
||||
|
||||
**Generate Button**: Start map generation with selected options
|
||||
|
||||
---
|
||||
|
||||
### Quick Regeneration
|
||||
|
||||
**Access:** Tools → Regenerate
|
||||
|
||||
Quickly regenerate specific map aspects:
|
||||
|
||||
- **Regenerate Cultures**: New culture distribution
|
||||
- **Regenerate States**: New political boundaries
|
||||
- **Regenerate Religions**: New religious landscape
|
||||
- **Regenerate Burgs**: New settlement locations
|
||||
- **Regenerate Rivers**: New river networks
|
||||
- **Regenerate Routes**: New road networks
|
||||
|
||||
Useful for refining maps without starting over.
|
||||
|
||||
---
|
||||
|
||||
## Editing Features
|
||||
|
||||
The generator includes 41+ specialized editors for fine-tuning every aspect of your map.
|
||||
|
||||
### Terrain Editing
|
||||
|
||||
#### Heightmap Editor
|
||||
|
||||
**Access:** Layers → Heightmap → Edit Heightmap
|
||||
|
||||
**Features:**
|
||||
- **Brush Tool**: Paint elevation
|
||||
- Adjustable size and strength
|
||||
- Raise or lower terrain
|
||||
- **Smooth Tool**: Soften elevation changes
|
||||
- **Flatten Tool**: Create plateaus
|
||||
- **Add/Remove Land**: Change coastlines
|
||||
- **Templates**: Apply heightmap patterns to regions
|
||||
- **Import Image**: Load custom heightmap
|
||||
|
||||
**Usage:**
|
||||
1. Select tool (brush, smooth, etc.)
|
||||
2. Adjust size and strength
|
||||
3. Click and drag on map
|
||||
4. Changes update in real-time
|
||||
|
||||
#### Biomes Editor
|
||||
|
||||
**Access:** Layers → Biomes → Edit Biomes
|
||||
|
||||
**Features:**
|
||||
- Change biome type for cells/regions
|
||||
- View biome distribution
|
||||
- Adjust climate parameters
|
||||
- Customize biome colors and properties
|
||||
|
||||
**Biome Types:**
|
||||
- Marine, Hot Desert, Cold Desert
|
||||
- Savanna, Grassland
|
||||
- Tropical Forest, Temperate Forest, Rainforest
|
||||
- Taiga, Tundra, Glacier
|
||||
- Wetland
|
||||
|
||||
#### Relief Editor
|
||||
|
||||
**Access:** Layers → Relief → Edit Relief
|
||||
|
||||
**Features:**
|
||||
- Add/remove terrain icons (mountains, hills, forests)
|
||||
- Adjust icon density
|
||||
- Change icon styles
|
||||
- Customize hill shading
|
||||
|
||||
---
|
||||
|
||||
### Water Features Editing
|
||||
|
||||
#### Rivers Editor
|
||||
|
||||
**Access:** Layers → Rivers → Edit Rivers
|
||||
|
||||
**Features:**
|
||||
- **Add River**: Click to create river source
|
||||
- **Remove River**: Delete rivers
|
||||
- **Regenerate River**: Recalculate specific river path
|
||||
- **Edit Path**: Modify river course
|
||||
- **Name Rivers**: Assign custom names
|
||||
- **Adjust Width**: Change river width
|
||||
|
||||
**River Properties:**
|
||||
- Name
|
||||
- Source and mouth
|
||||
- Length
|
||||
- Width
|
||||
- Type (river, stream, creek)
|
||||
- Parent (for tributaries)
|
||||
|
||||
#### Lakes Editor
|
||||
|
||||
**Access:** Layers → Lakes → Edit Lakes
|
||||
|
||||
**Features:**
|
||||
- Create new lakes
|
||||
- Remove lakes
|
||||
- Resize lakes
|
||||
- Name lakes
|
||||
- Adjust lake elevation
|
||||
|
||||
#### Coastline Editor
|
||||
|
||||
**Access:** Tools → Edit Coastline
|
||||
|
||||
**Features:**
|
||||
- Reshape coastlines
|
||||
- Add/remove coastal details
|
||||
- Create bays and peninsulas
|
||||
- Smooth jagged coasts
|
||||
|
||||
---
|
||||
|
||||
### Civilization Editing
|
||||
|
||||
#### Cultures Editor
|
||||
|
||||
**Access:** Layers → Cultures → Edit Cultures
|
||||
|
||||
**Features:**
|
||||
- **Add Culture**: Create new culture
|
||||
- **Remove Culture**: Delete culture
|
||||
- **Expand/Contract**: Adjust territory
|
||||
- **Properties**:
|
||||
- Name
|
||||
- Color
|
||||
- Name base (language)
|
||||
- Type (Generic, River, Lake, etc.)
|
||||
- Expansionism rate
|
||||
- Shield shape
|
||||
|
||||
**Culture List:**
|
||||
- View all cultures
|
||||
- See population and area
|
||||
- Filter by properties
|
||||
|
||||
#### States Editor
|
||||
|
||||
**Access:** Layers → States → Edit States
|
||||
|
||||
**Features:**
|
||||
- **Add State**: Create new state
|
||||
- **Remove State**: Delete state
|
||||
- **Merge States**: Combine multiple states
|
||||
- **Split State**: Divide into multiple states
|
||||
- **Change Capital**: Assign new capital city
|
||||
- **Adjust Borders**: Reshape boundaries
|
||||
|
||||
**State Properties:**
|
||||
- Name
|
||||
- Color
|
||||
- Capital burg
|
||||
- Government type (Kingdom, Empire, Republic, etc.)
|
||||
- Government form (Monarchy, Theocracy, etc.)
|
||||
- Culture
|
||||
- Religion
|
||||
- Expansionism
|
||||
- Military units
|
||||
- Diplomacy (relations with other states)
|
||||
|
||||
**Diplomacy:**
|
||||
- Set relations (Ally, Friendly, Neutral, Unfriendly, Enemy)
|
||||
- View diplomatic map
|
||||
|
||||
#### Burgs Editor (Settlements)
|
||||
|
||||
**Access:** Layers → Burgs → Edit Burgs
|
||||
|
||||
**Features:**
|
||||
- **Add Burg**: Place new settlement
|
||||
- **Remove Burg**: Delete settlement
|
||||
- **Move Burg**: Relocate settlement
|
||||
- **Properties**:
|
||||
- Name
|
||||
- Type (City, Town, Village)
|
||||
- Population
|
||||
- State
|
||||
- Culture
|
||||
- Capital status
|
||||
- Port/harbor
|
||||
- Citadel/fortress
|
||||
|
||||
**Settlement Types:**
|
||||
- **Capital**: State capital (largest)
|
||||
- **City**: Major urban center (10,000+)
|
||||
- **Town**: Smaller settlement (1,000-10,000)
|
||||
- **Village**: Small settlement (<1,000)
|
||||
|
||||
**Population:**
|
||||
- Manually set population
|
||||
- Auto-calculate based on surroundings
|
||||
- View urban vs. rural population
|
||||
|
||||
#### Religions Editor
|
||||
|
||||
**Access:** Layers → Religions → Edit Religions
|
||||
|
||||
**Features:**
|
||||
- **Add Religion**: Create new religion
|
||||
- **Remove Religion**: Delete religion
|
||||
- **Expand/Contract**: Adjust territory
|
||||
- **Properties**:
|
||||
- Name
|
||||
- Color
|
||||
- Type (Folk, Organized, Cult, Heresy)
|
||||
- Form (Cult, Church, Temple, etc.)
|
||||
- Origin culture
|
||||
- Deity name (if applicable)
|
||||
- Expansion strategy
|
||||
|
||||
#### Provinces Editor
|
||||
|
||||
**Access:** Layers → Provinces → Edit Provinces
|
||||
|
||||
**Features:**
|
||||
- Add/remove provinces
|
||||
- Adjust provincial boundaries
|
||||
- Assign provincial capitals
|
||||
- Name provinces
|
||||
- View province statistics
|
||||
|
||||
**Province Properties:**
|
||||
- Name
|
||||
- Form name (Duchy, County, Prefecture, etc.)
|
||||
- State
|
||||
- Capital burg
|
||||
- Area
|
||||
- Population
|
||||
|
||||
---
|
||||
|
||||
### Infrastructure Editing
|
||||
|
||||
#### Routes Editor
|
||||
|
||||
**Access:** Layers → Routes → Edit Routes
|
||||
|
||||
**Features:**
|
||||
- **Add Route**: Create road/trail/sea route
|
||||
- **Remove Route**: Delete route
|
||||
- **Regenerate Routes**: Recalculate optimal paths
|
||||
- **Edit Path**: Modify route course
|
||||
|
||||
**Route Types:**
|
||||
- **Roads**: Major land routes (black lines)
|
||||
- **Trails**: Minor paths (dashed lines)
|
||||
- **Sea Routes**: Maritime trade routes (blue lines)
|
||||
|
||||
**Properties:**
|
||||
- Connected burgs
|
||||
- Length
|
||||
- Width/importance
|
||||
- Path points
|
||||
|
||||
#### Military Overview
|
||||
|
||||
**Access:** Tools → Military
|
||||
|
||||
**Features:**
|
||||
- View all military units
|
||||
- Add/remove units
|
||||
- Assign units to burgs
|
||||
- Calculate military strength
|
||||
|
||||
**Unit Properties:**
|
||||
- Name
|
||||
- Type (Infantry, Cavalry, Archers, Artillery, Fleet)
|
||||
- Strength (number of soldiers)
|
||||
- State
|
||||
- Location (burg)
|
||||
|
||||
---
|
||||
|
||||
### Annotations and Markers
|
||||
|
||||
#### Markers Editor
|
||||
|
||||
**Access:** Layers → Markers → Edit Markers
|
||||
|
||||
**Features:**
|
||||
- **Add Marker**: Place custom markers
|
||||
- **Remove Marker**: Delete markers
|
||||
- **Properties**:
|
||||
- Type (volcano, ruins, mine, bridge, etc.)
|
||||
- Icon
|
||||
- Size
|
||||
- Associated note
|
||||
|
||||
**Marker Types:**
|
||||
- Volcanoes 🌋
|
||||
- Ruins 🏛️
|
||||
- Battlefields ⚔️
|
||||
- Mines ⛏️
|
||||
- Bridges 🌉
|
||||
- Monuments 🗿
|
||||
- Shrines ⛩️
|
||||
- Castles 🏰
|
||||
- Capitals ⭐
|
||||
|
||||
#### Notes Editor
|
||||
|
||||
**Access:** Tools → Notes
|
||||
|
||||
**Features:**
|
||||
- **Add Note**: Create text annotation
|
||||
- **Edit Note**: Modify note text
|
||||
- **Pin to Location**: Associate with marker/location
|
||||
- **Categories**: Organize notes by type
|
||||
|
||||
**Note Properties:**
|
||||
- Title
|
||||
- Description (rich text)
|
||||
- Legend text
|
||||
- Associated markers
|
||||
|
||||
#### Zones Editor
|
||||
|
||||
**Access:** Layers → Zones
|
||||
|
||||
**Features:**
|
||||
- Define custom zones/regions
|
||||
- Outline areas for campaigns
|
||||
- Mark territories
|
||||
- Add zone labels
|
||||
|
||||
---
|
||||
|
||||
## Visualization Features
|
||||
|
||||
### Style Editor
|
||||
|
||||
**Access:** Style → Edit Style
|
||||
|
||||
**Features:**
|
||||
|
||||
#### Color Schemes
|
||||
- **Terrain**: Heightmap coloring
|
||||
- **States**: Political boundaries
|
||||
- **Cultures**: Cultural regions
|
||||
- **Religions**: Religious distribution
|
||||
- **Biomes**: Vegetation zones
|
||||
|
||||
#### Presets
|
||||
- Default
|
||||
- Antique
|
||||
- Monochrome
|
||||
- Watercolor
|
||||
- And more...
|
||||
|
||||
#### Customization
|
||||
- Background color
|
||||
- Ocean color
|
||||
- Land gradient
|
||||
- Border styles
|
||||
- Label fonts and sizes
|
||||
|
||||
### Label Settings
|
||||
|
||||
**Access:** Style → Labels
|
||||
|
||||
**Features:**
|
||||
- **Show/Hide Labels**: Toggle label types
|
||||
- State names
|
||||
- Burg names
|
||||
- Province names
|
||||
- River names
|
||||
- Region names
|
||||
- **Font Settings**:
|
||||
- Font family
|
||||
- Font size
|
||||
- Font style (bold, italic)
|
||||
- Text color
|
||||
- Stroke color and width
|
||||
- **Label Positioning**: Auto or manual placement
|
||||
|
||||
### Layer Visibility
|
||||
|
||||
**Access:** Toolbar layer buttons
|
||||
|
||||
**Toggleable Layers:**
|
||||
- Terrain (heightmap)
|
||||
- Biomes
|
||||
- States
|
||||
- Cultures
|
||||
- Religions
|
||||
- Provinces
|
||||
- Borders
|
||||
- Rivers
|
||||
- Lakes
|
||||
- Coastline
|
||||
- Routes (roads, trails, sea routes)
|
||||
- Burgs (settlements)
|
||||
- Icons (relief icons)
|
||||
- Markers
|
||||
- Labels
|
||||
- Temperature (overlay)
|
||||
- Precipitation (overlay)
|
||||
- Population (density overlay)
|
||||
- Grid
|
||||
- Coordinates
|
||||
- Scale bar
|
||||
- Compass
|
||||
- Legend
|
||||
|
||||
---
|
||||
|
||||
### Temperature and Precipitation
|
||||
|
||||
**Access:** Layers → Temperature / Precipitation
|
||||
|
||||
**Features:**
|
||||
- View temperature distribution
|
||||
- View precipitation patterns
|
||||
- Adjust climate parameters
|
||||
- See climate effects on biomes
|
||||
|
||||
**Display:**
|
||||
- Heat map overlay
|
||||
- Gradient visualization
|
||||
- Isolines
|
||||
|
||||
---
|
||||
|
||||
### 3D View
|
||||
|
||||
**Access:** Tools → 3D View
|
||||
|
||||
**Features:**
|
||||
- 3D terrain visualization
|
||||
- Rotate and zoom
|
||||
- Adjust elevation exaggeration
|
||||
- Change lighting angle
|
||||
- Export 3D view
|
||||
|
||||
**Controls:**
|
||||
- Mouse drag to rotate
|
||||
- Scroll to zoom
|
||||
- Sliders for parameters
|
||||
|
||||
---
|
||||
|
||||
### Emblems and Heraldry
|
||||
|
||||
**Access:** Click on state/burg/province
|
||||
|
||||
**Features:**
|
||||
- View coat of arms
|
||||
- Regenerate heraldry
|
||||
- Customize elements:
|
||||
- Shield shape
|
||||
- Divisions
|
||||
- Charges (symbols)
|
||||
- Tinctures (colors)
|
||||
|
||||
**Heraldic Elements:**
|
||||
- 200+ charges (lions, eagles, crowns, etc.)
|
||||
- Multiple shield shapes
|
||||
- Standard heraldic rules
|
||||
- Export as SVG/PNG
|
||||
|
||||
---
|
||||
|
||||
## Export and Save Features
|
||||
|
||||
### Save Map
|
||||
|
||||
**Access:** File → Save Map
|
||||
|
||||
**Formats:**
|
||||
- **.map** - Native format (includes all data)
|
||||
- Compressed JSON
|
||||
- Can be loaded later
|
||||
|
||||
**Features:**
|
||||
- Auto-save to browser storage
|
||||
- Manual save to file
|
||||
- Save to cloud (Dropbox integration)
|
||||
|
||||
---
|
||||
|
||||
### Load Map
|
||||
|
||||
**Access:** File → Load Map
|
||||
|
||||
**Sources:**
|
||||
- Local file
|
||||
- URL
|
||||
- Dropbox
|
||||
- Browser storage (auto-saved)
|
||||
|
||||
**Compatibility:**
|
||||
- Automatic version migration
|
||||
- Handles old map formats
|
||||
- Validates data integrity
|
||||
|
||||
---
|
||||
|
||||
### Export Options
|
||||
|
||||
**Access:** File → Export
|
||||
|
||||
#### Export SVG
|
||||
|
||||
- Vector format
|
||||
- Scalable without quality loss
|
||||
- Edit in Inkscape, Illustrator, etc.
|
||||
- Options:
|
||||
- All layers or selected layers
|
||||
- Embedded fonts
|
||||
- Optimized output
|
||||
|
||||
#### Export PNG
|
||||
|
||||
- Raster format
|
||||
- High resolution available
|
||||
- Options:
|
||||
- Resolution (DPI)
|
||||
- Size (width × height)
|
||||
- Quality
|
||||
- Transparent background
|
||||
|
||||
#### Export JSON
|
||||
|
||||
- Raw data export
|
||||
- All map data in JSON format
|
||||
- Use for custom processing
|
||||
- Import into other tools
|
||||
|
||||
#### Export Other Formats
|
||||
|
||||
- **PDF**: Print-ready format
|
||||
- **CSV**: Data tables (burgs, states, etc.)
|
||||
- **GeoJSON**: Geographic data format
|
||||
|
||||
---
|
||||
|
||||
### Print Map
|
||||
|
||||
**Access:** File → Print
|
||||
|
||||
**Features:**
|
||||
- Print-optimized layout
|
||||
- Paper size selection
|
||||
- Scale adjustment
|
||||
- Layer selection
|
||||
- Preview before printing
|
||||
|
||||
---
|
||||
|
||||
## Advanced Features
|
||||
|
||||
### Submaps
|
||||
|
||||
**Access:** Tools → Create Submap
|
||||
|
||||
**Purpose:** Generate detailed map of a specific region
|
||||
|
||||
**Features:**
|
||||
- Select region on main map
|
||||
- Generate high-detail submap
|
||||
- Inherit terrain and features
|
||||
- Independent editing
|
||||
|
||||
**Use Cases:**
|
||||
- Zooming into a kingdom
|
||||
- Detailed city surroundings
|
||||
- Regional campaigns
|
||||
|
||||
---
|
||||
|
||||
### Focus Mode
|
||||
|
||||
**Access:** Tools → Focus
|
||||
|
||||
**Features:**
|
||||
- **Focus on Cell**: Zoom to specific cell
|
||||
- **Focus on Burg**: Center on settlement
|
||||
- **Focus on Coordinates**: Go to X, Y position
|
||||
|
||||
---
|
||||
|
||||
### Elevation Profile
|
||||
|
||||
**Access:** Tools → Elevation Profile
|
||||
|
||||
**Features:**
|
||||
- Draw line on map
|
||||
- View elevation graph along line
|
||||
- Measure distance
|
||||
- Identify peaks and valleys
|
||||
|
||||
---
|
||||
|
||||
### Battle Screen
|
||||
|
||||
**Access:** Tools → Battle Screen
|
||||
|
||||
**Features:**
|
||||
- Tactical battle map view
|
||||
- Hexagonal grid overlay
|
||||
- Unit placement
|
||||
- Terrain effects
|
||||
|
||||
---
|
||||
|
||||
### Customization
|
||||
|
||||
#### Custom Name Bases
|
||||
|
||||
**Access:** Tools → Name Bases
|
||||
|
||||
**Features:**
|
||||
- Add custom language/naming
|
||||
- Provide example names
|
||||
- Generator learns patterns
|
||||
- Apply to cultures
|
||||
|
||||
#### Custom Biomes
|
||||
|
||||
**Access:** Biomes → Customize
|
||||
|
||||
**Features:**
|
||||
- Define new biome types
|
||||
- Set climate parameters
|
||||
- Assign colors and icons
|
||||
- Adjust habitability
|
||||
|
||||
---
|
||||
|
||||
### Versioning
|
||||
|
||||
**Access:** Automatic
|
||||
|
||||
**Features:**
|
||||
- Maps store version info
|
||||
- Auto-upgrade on load
|
||||
- Maintains compatibility
|
||||
- Migration scripts for old maps
|
||||
|
||||
Handled by `versioning.js`.
|
||||
|
||||
---
|
||||
|
||||
### Undo/Redo
|
||||
|
||||
**Access:** Edit menu or Ctrl+Z / Ctrl+Y
|
||||
|
||||
**Features:**
|
||||
- Undo recent changes
|
||||
- Redo undone changes
|
||||
- History tracking
|
||||
- Multiple undo levels
|
||||
|
||||
---
|
||||
|
||||
### Keyboard Shortcuts
|
||||
|
||||
**Common Shortcuts:**
|
||||
- **Ctrl+Z**: Undo
|
||||
- **Ctrl+Y**: Redo
|
||||
- **Ctrl+S**: Save map
|
||||
- **Ctrl+O**: Open map
|
||||
- **F11**: Fullscreen
|
||||
- **Space**: Pan mode
|
||||
- **+/-**: Zoom in/out
|
||||
- **Esc**: Cancel current operation
|
||||
|
||||
---
|
||||
|
||||
### Map Statistics
|
||||
|
||||
**Access:** Tools → Statistics
|
||||
|
||||
**Features:**
|
||||
- Total land area
|
||||
- Total population
|
||||
- Number of states
|
||||
- Number of burgs
|
||||
- Culture distribution
|
||||
- Religion distribution
|
||||
- Biome distribution
|
||||
- And more...
|
||||
|
||||
**Export:** Export statistics as CSV/JSON
|
||||
|
||||
---
|
||||
|
||||
### Randomization Tools
|
||||
|
||||
**Access:** Tools → Randomize
|
||||
|
||||
**Features:**
|
||||
- Randomize names (burgs, states, etc.)
|
||||
- Randomize colors
|
||||
- Randomize coats of arms
|
||||
- Randomize any specific aspect
|
||||
|
||||
Useful for quickly generating variations.
|
||||
|
||||
---
|
||||
|
||||
## Tips and Tricks
|
||||
|
||||
### Performance Optimization
|
||||
|
||||
1. **Lower cell count** for faster generation
|
||||
2. **Disable unused layers** for better rendering
|
||||
3. **Use simple styles** for complex maps
|
||||
4. **Close editors** when not in use
|
||||
|
||||
### Best Practices
|
||||
|
||||
1. **Save frequently** to avoid data loss
|
||||
2. **Use seeds** for reproducibility
|
||||
3. **Start with templates** then customize
|
||||
4. **Layer edits** progressively (terrain → cultures → states)
|
||||
5. **Backup important maps**
|
||||
|
||||
### Common Workflows
|
||||
|
||||
#### Creating a Campaign Map
|
||||
|
||||
1. Generate base map with template
|
||||
2. Adjust terrain with heightmap editor
|
||||
3. Refine rivers and lakes
|
||||
4. Edit culture and state boundaries
|
||||
5. Add important cities/locations
|
||||
6. Place markers for quest locations
|
||||
7. Add notes for lore
|
||||
8. Style and export
|
||||
|
||||
#### Creating a World Map
|
||||
|
||||
1. Use "Continents" template
|
||||
2. Generate with medium cell count
|
||||
3. Focus on large-scale features
|
||||
4. Simplify details (fewer burgs)
|
||||
5. Adjust states for empires/kingdoms
|
||||
6. Export at high resolution
|
||||
|
||||
#### Creating a Regional Map
|
||||
|
||||
1. Use "Peninsula" or custom template
|
||||
2. High cell count for detail
|
||||
3. Add many burgs
|
||||
4. Detailed provinces
|
||||
5. Add markers for every point of interest
|
||||
6. Extensive notes and lore
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
**Map Won't Generate:**
|
||||
- Check browser console for errors
|
||||
- Try lower cell count
|
||||
- Use different template
|
||||
- Clear browser cache
|
||||
|
||||
**Performance Issues:**
|
||||
- Reduce cell count
|
||||
- Disable complex layers
|
||||
- Close other browser tabs
|
||||
- Use modern browser
|
||||
|
||||
**Export Not Working:**
|
||||
- Check browser permissions
|
||||
- Try different format
|
||||
- Reduce export size
|
||||
- Update browser
|
||||
|
||||
**Data Loss:**
|
||||
- Check auto-save in browser storage
|
||||
- Look for backup files
|
||||
- Enable cloud save
|
||||
|
||||
For more help:
|
||||
- [GitHub Issues](https://github.com/Azgaar/Fantasy-Map-Generator/issues)
|
||||
- [Discord Community](https://discordapp.com/invite/X7E84HU)
|
||||
- [Reddit Community](https://www.reddit.com/r/FantasyMapGenerator)
|
||||
|
||||
---
|
||||
|
||||
## Further Reading
|
||||
|
||||
- [Generation Process](Generation-Process.md) - How maps are created
|
||||
- [Data Model](Data-Model.md) - Understanding the data
|
||||
- [Modules Reference](Modules-Reference.md) - Technical details
|
||||
- [Architecture](Architecture.md) - System design
|
||||
805
wiki/Generation-Process.md
Normal file
805
wiki/Generation-Process.md
Normal file
|
|
@ -0,0 +1,805 @@
|
|||
# Map Generation Process
|
||||
|
||||
This document explains how the Fantasy Map Generator creates maps, describing each step of the generation pipeline in detail.
|
||||
|
||||
## Overview
|
||||
|
||||
Map generation is a multi-stage process where each stage builds upon the previous one. The entire process is orchestrated by the `generate()` function in `main.js`.
|
||||
|
||||
## Generation Pipeline
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ 1. Initialization │
|
||||
│ • Set random seed │
|
||||
│ • Apply map size and options │
|
||||
│ • Initialize data structures │
|
||||
└────────────────────┬────────────────────────────────────┘
|
||||
│
|
||||
┌────────────────────▼────────────────────────────────────┐
|
||||
│ 2. Grid Generation │
|
||||
│ • Create jittered point grid │
|
||||
│ • Generate Voronoi diagram via Delaunay triangulation │
|
||||
│ • ~10,000 cells by default │
|
||||
└────────────────────┬────────────────────────────────────┘
|
||||
│
|
||||
┌────────────────────▼────────────────────────────────────┐
|
||||
│ 3. Heightmap Generation │
|
||||
│ • Generate terrain elevation (0-100) │
|
||||
│ • Use templates or custom heightmaps │
|
||||
│ • Sea level typically at 20 │
|
||||
└────────────────────┬────────────────────────────────────┘
|
||||
│
|
||||
┌────────────────────▼────────────────────────────────────┐
|
||||
│ 4. Feature Detection │
|
||||
│ • Identify land vs water │
|
||||
│ • Detect islands, continents, oceans │
|
||||
│ • Mark coastal cells │
|
||||
└────────────────────┬────────────────────────────────────┘
|
||||
│
|
||||
┌────────────────────▼────────────────────────────────────┐
|
||||
│ 5. Climate Calculation │
|
||||
│ • Calculate temperature (latitude-based) │
|
||||
│ • Generate precipitation patterns │
|
||||
│ • Wind and moisture simulation │
|
||||
└────────────────────┬────────────────────────────────────┘
|
||||
│
|
||||
┌────────────────────▼────────────────────────────────────┐
|
||||
│ 6. Repack Grid │
|
||||
│ • Filter land cells from grid │
|
||||
│ • Create pack structure │
|
||||
│ • Add additional cell properties │
|
||||
└────────────────────┬────────────────────────────────────┘
|
||||
│
|
||||
┌────────────────────▼────────────────────────────────────┐
|
||||
│ 7. Water Features │
|
||||
│ • Draw coastlines │
|
||||
│ • Generate rivers (flux calculation + flow) │
|
||||
│ • Create lakes in depressions │
|
||||
│ • Define lake groups │
|
||||
└────────────────────┬────────────────────────────────────┘
|
||||
│
|
||||
┌────────────────────▼────────────────────────────────────┐
|
||||
│ 8. Biome Assignment │
|
||||
│ • Map temperature + precipitation to biomes │
|
||||
│ • 13 biome types (desert, forest, tundra, etc.) │
|
||||
│ • Store in pack.cells.biome │
|
||||
└────────────────────┬────────────────────────────────────┘
|
||||
│
|
||||
┌────────────────────▼────────────────────────────────────┐
|
||||
│ 9. Cell Ranking │
|
||||
│ • Calculate cell suitability for settlement │
|
||||
│ • Based on terrain, biome, rivers, coasts │
|
||||
│ • Used for placement of towns/cities │
|
||||
└────────────────────┬────────────────────────────────────┘
|
||||
│
|
||||
┌────────────────────▼────────────────────────────────────┐
|
||||
│ 10. Culture Generation │
|
||||
│ • Place culture centers │
|
||||
│ • Expand cultures across suitable cells │
|
||||
│ • Assign name generation bases │
|
||||
└────────────────────┬────────────────────────────────────┘
|
||||
│
|
||||
┌────────────────────▼────────────────────────────────────┐
|
||||
│ 11. Burgs and States │
|
||||
│ • Place capital cities │
|
||||
│ • Generate states around capitals │
|
||||
│ • Add secondary towns │
|
||||
│ • Define state boundaries │
|
||||
└────────────────────┬────────────────────────────────────┘
|
||||
│
|
||||
┌────────────────────▼────────────────────────────────────┐
|
||||
│ 12. Religion Generation │
|
||||
│ • Create religions from cultures │
|
||||
│ • Spread religions across territories │
|
||||
│ • Assign state religions │
|
||||
└────────────────────┬────────────────────────────────────┘
|
||||
│
|
||||
┌────────────────────▼────────────────────────────────────┐
|
||||
│ 13. Provinces │
|
||||
│ • Divide states into provinces │
|
||||
│ • Assign provincial capitals │
|
||||
│ • Define provincial boundaries │
|
||||
└────────────────────┬────────────────────────────────────┘
|
||||
│
|
||||
┌────────────────────▼────────────────────────────────────┐
|
||||
│ 14. Route Generation │
|
||||
│ • Create road networks between burgs │
|
||||
│ • Generate sea routes │
|
||||
│ • Add trails to secondary locations │
|
||||
└────────────────────┬────────────────────────────────────┘
|
||||
│
|
||||
┌────────────────────▼────────────────────────────────────┐
|
||||
│ 15. Military Generation │
|
||||
│ • Create military units for states │
|
||||
│ • Assign regiments to burgs │
|
||||
│ • Calculate military strength │
|
||||
└────────────────────┬────────────────────────────────────┘
|
||||
│
|
||||
┌────────────────────▼────────────────────────────────────┐
|
||||
│ 16. Marker Generation │
|
||||
│ • Place special markers (volcanoes, ruins, etc.) │
|
||||
│ • Add points of interest │
|
||||
└────────────────────┬────────────────────────────────────┘
|
||||
│
|
||||
┌────────────────────▼────────────────────────────────────┐
|
||||
│ 17. Rendering │
|
||||
│ • Draw all map layers to SVG │
|
||||
│ • Render states, borders, labels │
|
||||
│ • Apply styling │
|
||||
│ • Add UI elements (scale, compass, legend) │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Detailed Stage Descriptions
|
||||
|
||||
### 1. Initialization
|
||||
|
||||
**File:** `main.js`
|
||||
**Function:** `generate()`
|
||||
|
||||
```javascript
|
||||
async function generate(options) {
|
||||
seed = generateSeed();
|
||||
Math.random = aleaPRNG(seed); // Set seeded RNG
|
||||
applyGraphSize(); // Set SVG dimensions
|
||||
randomizeOptions(); // Initialize generation parameters
|
||||
}
|
||||
```
|
||||
|
||||
**Purpose:**
|
||||
- Establishes random seed for reproducibility
|
||||
- Sets map dimensions (width, height)
|
||||
- Initializes generation options (templates, settings)
|
||||
|
||||
**Seed:**
|
||||
- Can be user-specified or randomly generated
|
||||
- Ensures identical maps can be regenerated
|
||||
- Format: Short string (e.g., "abc123")
|
||||
|
||||
### 2. Grid Generation
|
||||
|
||||
**File:** `main.js`
|
||||
**Function:** `generateGrid()`
|
||||
|
||||
```javascript
|
||||
function generateGrid() {
|
||||
const points = generateJitteredPoints(cellsDesired);
|
||||
const delaunay = Delaunator.from(points);
|
||||
const voronoi = new Voronoi(delaunay, points);
|
||||
grid = voronoi.toGrid();
|
||||
}
|
||||
```
|
||||
|
||||
**Purpose:**
|
||||
- Creates the spatial data structure for the map
|
||||
- Divides map into cells using Voronoi diagram
|
||||
|
||||
**Process:**
|
||||
1. Generate ~10,000 points in a jittered grid pattern
|
||||
2. Create Delaunay triangulation from points
|
||||
3. Compute dual Voronoi diagram
|
||||
4. Store in `grid` object
|
||||
|
||||
**Why Voronoi?**
|
||||
- Natural-looking irregular cells
|
||||
- Efficient neighbor lookups
|
||||
- Well-suited for procedural generation
|
||||
|
||||
### 3. Heightmap Generation
|
||||
|
||||
**File:** `modules/heightmap-generator.js`
|
||||
**Module:** `HeightmapGenerator`
|
||||
|
||||
```javascript
|
||||
await HeightmapGenerator.generate();
|
||||
```
|
||||
|
||||
**Templates Available:**
|
||||
- **Pangea** - Single large continent
|
||||
- **Archipelago** - Many islands
|
||||
- **Atoll** - Ring-shaped island
|
||||
- **Continents** - Multiple landmasses
|
||||
- **High Island** - Volcanic island
|
||||
- **Low Island** - Flat coral island
|
||||
- **And more...**
|
||||
|
||||
**Process:**
|
||||
1. Select template or use custom heightmap
|
||||
2. Apply template algorithm to assign elevations
|
||||
3. Smooth and add noise for realism
|
||||
4. Normalize values to 0-100 range
|
||||
5. Store in `grid.cells.h`
|
||||
|
||||
**Height Conventions:**
|
||||
- `0-19`: Water (ocean/lakes)
|
||||
- `20`: Sea level
|
||||
- `20-30`: Coastal lowlands
|
||||
- `30-50`: Plains
|
||||
- `50-70`: Hills
|
||||
- `70+`: Mountains
|
||||
|
||||
### 4. Feature Detection
|
||||
|
||||
**File:** `main.js`
|
||||
**Function:** `markFeatures()`
|
||||
|
||||
```javascript
|
||||
function markFeatures() {
|
||||
detectIslands();
|
||||
markOceans();
|
||||
markLakes();
|
||||
markCoastalCells();
|
||||
}
|
||||
```
|
||||
|
||||
**Purpose:**
|
||||
- Identifies distinct geographic features
|
||||
- Labels landmasses and water bodies
|
||||
- Detects borders and coastlines
|
||||
|
||||
**Feature Types:**
|
||||
- **Islands/Continents**: Contiguous land areas
|
||||
- **Oceans**: Large water bodies touching borders
|
||||
- **Lakes**: Enclosed water bodies on land
|
||||
|
||||
Each feature gets a unique ID stored in `grid.cells.f`.
|
||||
|
||||
### 5. Climate Calculation
|
||||
|
||||
**File:** `main.js`
|
||||
**Functions:** `calculateTemperatures()`, `generatePrecipitation()`
|
||||
|
||||
**Temperature:**
|
||||
```javascript
|
||||
// Based on latitude
|
||||
const latitude = y / mapHeight; // 0 = north, 1 = south
|
||||
const temp = temperatureCurve(latitude, elevation);
|
||||
grid.cells.temp[i] = temp;
|
||||
```
|
||||
|
||||
Factors affecting temperature:
|
||||
- **Latitude** - Colder at poles, warmer at equator
|
||||
- **Elevation** - Decreases with height
|
||||
- **Ocean proximity** - Moderating effect
|
||||
|
||||
**Precipitation:**
|
||||
```javascript
|
||||
// Moisture from oceans, modified by prevailing winds
|
||||
const prec = calculateMoisture(cell, windDirection);
|
||||
grid.cells.prec[i] = prec;
|
||||
```
|
||||
|
||||
Factors affecting precipitation:
|
||||
- **Ocean proximity** - Higher near coasts
|
||||
- **Wind direction** - Prevailing winds bring moisture
|
||||
- **Elevation** - Rain shadow effects
|
||||
- **Temperature** - Warmer air holds more moisture
|
||||
|
||||
### 6. Repack Grid
|
||||
|
||||
**File:** `main.js`
|
||||
**Function:** `reGraph()`
|
||||
|
||||
```javascript
|
||||
function reGraph() {
|
||||
pack.cells = filterLandCells(grid.cells);
|
||||
pack.vertices = grid.vertices;
|
||||
// Add additional properties...
|
||||
}
|
||||
```
|
||||
|
||||
**Purpose:**
|
||||
- Creates optimized structure for land-only operations
|
||||
- Removes ocean cells to save memory
|
||||
- Adds civilization-related properties
|
||||
|
||||
**New Properties Added:**
|
||||
- `s` - State ID
|
||||
- `culture` - Culture ID
|
||||
- `religion` - Religion ID
|
||||
- `burg` - Settlement ID
|
||||
- `province` - Province ID
|
||||
- `road` - Road network
|
||||
- `pop` - Population density
|
||||
|
||||
### 7. Water Features
|
||||
|
||||
#### Coastline Drawing
|
||||
|
||||
**File:** `main.js`
|
||||
**Function:** `drawCoastline()`
|
||||
|
||||
Renders coastlines to SVG for visualization.
|
||||
|
||||
#### River Generation
|
||||
|
||||
**File:** `modules/river-generator.js`
|
||||
**Module:** `Rivers.generate()`
|
||||
|
||||
```javascript
|
||||
Rivers.generate() {
|
||||
calculateFlux(); // Water accumulation
|
||||
createRiverPaths(); // Route rivers downhill
|
||||
applyDowncutting(); // Erosion simulation
|
||||
detectConfluence(); // Identify river junctions
|
||||
}
|
||||
```
|
||||
|
||||
**Flux Calculation:**
|
||||
- Each cell receives water from precipitation
|
||||
- Water flows to lowest adjacent cell
|
||||
- Accumulates creating river strength
|
||||
|
||||
**River Pathing:**
|
||||
- Start from high-flux cells
|
||||
- Follow elevation gradient downward
|
||||
- Terminate at ocean or lake
|
||||
- Tributaries merge into larger rivers
|
||||
|
||||
**Downcutting:**
|
||||
- Rivers erode terrain over time
|
||||
- Lowers elevation along river paths
|
||||
- Creates valleys and canyons
|
||||
|
||||
#### Lake Creation
|
||||
|
||||
**File:** `modules/lakes.js`
|
||||
**Module:** `Lakes.defineGroup()`
|
||||
|
||||
- Identifies water cells not connected to ocean
|
||||
- Groups adjacent lake cells
|
||||
- Names lakes
|
||||
- Calculates lake areas
|
||||
|
||||
### 8. Biome Assignment
|
||||
|
||||
**File:** `modules/biomes.js`
|
||||
**Module:** `Biomes.define()`
|
||||
|
||||
```javascript
|
||||
Biomes.define() {
|
||||
for (const cell of pack.cells.i) {
|
||||
const temp = pack.cells.temp[cell];
|
||||
const prec = pack.cells.prec[cell];
|
||||
const biome = biomeMatrix[temp][prec];
|
||||
pack.cells.biome[cell] = biome;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Biome Matrix:**
|
||||
Maps temperature + precipitation to biome types:
|
||||
|
||||
```
|
||||
Precipitation →
|
||||
Low Medium High
|
||||
┌──────────┬──────────┬──────────┐
|
||||
T Hot │ Desert │ Savanna │ Tropical │
|
||||
e ├──────────┼──────────┼──────────┤
|
||||
m Warm │Grassland │ Forest │Rainforest│
|
||||
p ├──────────┼──────────┼──────────┤
|
||||
↓ Cold │ Tundra │ Taiga │ Wetland │
|
||||
└──────────┴──────────┴──────────┘
|
||||
```
|
||||
|
||||
**13 Biome Types:**
|
||||
1. Marine (ocean)
|
||||
2. Hot desert
|
||||
3. Cold desert
|
||||
4. Savanna
|
||||
5. Grassland
|
||||
6. Tropical seasonal forest
|
||||
7. Temperate deciduous forest
|
||||
8. Tropical rainforest
|
||||
9. Temperate rainforest
|
||||
10. Taiga
|
||||
11. Tundra
|
||||
12. Glacier
|
||||
13. Wetland
|
||||
|
||||
### 9. Cell Ranking
|
||||
|
||||
**File:** `main.js`
|
||||
**Function:** `rankCells()`
|
||||
|
||||
```javascript
|
||||
function rankCells() {
|
||||
for (const cell of pack.cells.i) {
|
||||
let score = 0;
|
||||
score += biomeHabitability[pack.cells.biome[cell]];
|
||||
score += riverBonus[pack.cells.r[cell]];
|
||||
score += coastalBonus[isCoastal(cell)];
|
||||
score -= elevationPenalty[pack.cells.h[cell]];
|
||||
pack.cells.s[cell] = score;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Factors:**
|
||||
- **Biome habitability** - Forests good, deserts bad
|
||||
- **River proximity** - Rivers provide water and trade
|
||||
- **Coastal location** - Access to fishing and trade
|
||||
- **Elevation** - Lowlands preferred over mountains
|
||||
|
||||
**Used For:**
|
||||
- Selecting locations for towns and cities
|
||||
- Expanding cultures and states
|
||||
- Calculating population density
|
||||
|
||||
### 10. Culture Generation
|
||||
|
||||
**File:** `modules/cultures-generator.js`
|
||||
**Module:** `Cultures.generate()` and `Cultures.expand()`
|
||||
|
||||
**Generation Process:**
|
||||
|
||||
```javascript
|
||||
Cultures.generate() {
|
||||
const count = rn(5, 10); // 5-10 cultures
|
||||
for (let i = 0; i < count; i++) {
|
||||
const center = selectHighRankCell();
|
||||
const culture = createCulture(center);
|
||||
pack.cultures.push(culture);
|
||||
}
|
||||
}
|
||||
|
||||
Cultures.expand() {
|
||||
// Expand from centers using expansion algorithm
|
||||
for (const culture of pack.cultures) {
|
||||
expandFromCenter(culture, culture.expansionism);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Placement:**
|
||||
- Cultures start at high-rank cells
|
||||
- Multiple cultures per map (5-10 typical)
|
||||
|
||||
**Expansion:**
|
||||
- Spreads outward from origin
|
||||
- Prefers habitable terrain
|
||||
- Stops at natural barriers (oceans, mountains)
|
||||
- Fills until meeting other cultures
|
||||
|
||||
**Properties:**
|
||||
- Name (procedurally generated)
|
||||
- Color (for map display)
|
||||
- Name base (for generating place names)
|
||||
- Type (Generic, River, Lake, Naval, etc.)
|
||||
- Shield shape (for coat of arms)
|
||||
|
||||
### 11. Burgs and States
|
||||
|
||||
**File:** `modules/burgs-and-states.js`
|
||||
**Module:** `BurgsAndStates.generate()`
|
||||
|
||||
**Capital Placement:**
|
||||
|
||||
```javascript
|
||||
BurgsAndStates.generate() {
|
||||
// 1. Place capitals
|
||||
for (const culture of pack.cultures) {
|
||||
const capital = placeCapital(culture);
|
||||
pack.burgs.push(capital);
|
||||
}
|
||||
|
||||
// 2. Create states from capitals
|
||||
for (const capital of capitals) {
|
||||
const state = createState(capital);
|
||||
expandState(state);
|
||||
pack.states.push(state);
|
||||
}
|
||||
|
||||
// 3. Add secondary towns
|
||||
addSecondaryBurgs();
|
||||
}
|
||||
```
|
||||
|
||||
**Burg Types:**
|
||||
- **Capital** - State capital (largest city)
|
||||
- **City** - Major urban center
|
||||
- **Town** - Smaller settlement
|
||||
|
||||
**Burg Properties:**
|
||||
- Name (from culture's name base)
|
||||
- Population (based on rank + surroundings)
|
||||
- Type (city, town, etc.)
|
||||
- Port status (if coastal)
|
||||
- Citadel (defensive structures)
|
||||
|
||||
**State Creation:**
|
||||
- Each capital becomes center of a state
|
||||
- State expands to fill territory
|
||||
- Boundaries form where states meet
|
||||
- Neutral areas remain unclaimed
|
||||
|
||||
**State Properties:**
|
||||
- Name (from capital + government form)
|
||||
- Color (randomly assigned)
|
||||
- Type (Kingdom, Empire, Republic, etc.)
|
||||
- Culture (dominant culture)
|
||||
- Religion (state religion)
|
||||
- Expansionism (aggressiveness)
|
||||
|
||||
### 12. Religion Generation
|
||||
|
||||
**File:** `modules/religions-generator.js`
|
||||
**Module:** `Religions.generate()`
|
||||
|
||||
```javascript
|
||||
Religions.generate() {
|
||||
const count = rn(5, 10);
|
||||
for (let i = 0; i < count; i++) {
|
||||
const culture = selectRandomCulture();
|
||||
const religion = createReligion(culture);
|
||||
pack.religions.push(religion);
|
||||
expandReligion(religion);
|
||||
}
|
||||
assignStateReligions();
|
||||
}
|
||||
```
|
||||
|
||||
**Religion Types:**
|
||||
- Folk religions (localized)
|
||||
- Organized religions (widespread)
|
||||
- Cults (small followings)
|
||||
|
||||
**Expansion:**
|
||||
- Spreads from origin culture
|
||||
- Can cross state borders
|
||||
- Expansion rate varies by type
|
||||
- Some states adopt as official religion
|
||||
|
||||
### 13. Province Generation
|
||||
|
||||
**File:** `modules/burgs-and-states.js`
|
||||
**Module:** `BurgsAndStates.generateProvinces()`
|
||||
|
||||
```javascript
|
||||
BurgsAndStates.generateProvinces() {
|
||||
for (const state of pack.states) {
|
||||
const provinceCount = calculateProvinceCount(state.area);
|
||||
divideIntoProvinces(state, provinceCount);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Process:**
|
||||
- Larger states divided into provinces
|
||||
- Each province has a capital burg
|
||||
- Province boundaries respect state borders
|
||||
- Names generated from capitals + titles
|
||||
|
||||
### 14. Route Generation
|
||||
|
||||
**File:** `modules/routes-generator.js`
|
||||
**Module:** `Routes.generate()`
|
||||
|
||||
```javascript
|
||||
Routes.generate() {
|
||||
generateRoads(); // Land routes between burgs
|
||||
generateTrails(); // Secondary paths
|
||||
generateSeaRoutes(); // Maritime trade routes
|
||||
}
|
||||
```
|
||||
|
||||
**Road Generation:**
|
||||
- Connects burgs within states
|
||||
- Pathfinding considers terrain
|
||||
- Major roads between large cities
|
||||
- Secondary roads to smaller towns
|
||||
|
||||
**Sea Routes:**
|
||||
- Connects coastal burgs
|
||||
- Maritime trade routes
|
||||
- Follows coastlines or crosses seas
|
||||
|
||||
**Route Properties:**
|
||||
- Width/importance
|
||||
- Points along route
|
||||
- Connected burgs
|
||||
|
||||
### 15. Military Generation
|
||||
|
||||
**File:** `modules/military-generator.js`
|
||||
**Module:** `Military.generate()`
|
||||
|
||||
```javascript
|
||||
Military.generate() {
|
||||
for (const state of pack.states) {
|
||||
const unitCount = calculateUnits(state.population);
|
||||
for (let i = 0; i < unitCount; i++) {
|
||||
const unit = createMilitaryUnit(state);
|
||||
state.military.push(unit);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Military Units:**
|
||||
- Based on state population
|
||||
- Assigned to burgs
|
||||
- Types: infantry, cavalry, archers, etc.
|
||||
- Used for calculating state strength
|
||||
|
||||
### 16. Marker Generation
|
||||
|
||||
**File:** `modules/markers-generator.js`
|
||||
**Module:** `Markers.generate()`
|
||||
|
||||
```javascript
|
||||
Markers.generate() {
|
||||
placeVolcanoes();
|
||||
placeRuins();
|
||||
placeBattlefields();
|
||||
// ... other marker types
|
||||
}
|
||||
```
|
||||
|
||||
**Marker Types:**
|
||||
- Volcanoes (on mountains)
|
||||
- Ruins (ancient sites)
|
||||
- Battlefields (historical locations)
|
||||
- Monuments
|
||||
- Mines
|
||||
- Bridges
|
||||
- And more...
|
||||
|
||||
**Placement:**
|
||||
- Based on terrain suitability
|
||||
- Random with constraints
|
||||
- Can be manually added by users
|
||||
|
||||
### 17. Rendering
|
||||
|
||||
**File:** `main.js`
|
||||
**Multiple Functions:** `drawStates()`, `drawRivers()`, `drawLabels()`, etc.
|
||||
|
||||
```javascript
|
||||
function renderMap() {
|
||||
drawOcean();
|
||||
drawTerrain();
|
||||
drawBiomes();
|
||||
drawRivers();
|
||||
drawLakes();
|
||||
drawStates();
|
||||
drawBorders();
|
||||
drawRoutes();
|
||||
drawBurgs();
|
||||
drawLabels();
|
||||
drawIcons();
|
||||
drawScaleBar();
|
||||
drawCompass();
|
||||
}
|
||||
```
|
||||
|
||||
**Rendering Process:**
|
||||
- Uses D3.js for SVG manipulation
|
||||
- Layers drawn in order (back to front)
|
||||
- Styling applied from templates
|
||||
- Interactive elements attached
|
||||
|
||||
**Performance:**
|
||||
- Selective layer updates
|
||||
- Efficient D3 data binding
|
||||
- Minimal redraws during editing
|
||||
|
||||
## Generation Options
|
||||
|
||||
Users can customize generation through various options:
|
||||
|
||||
### Heightmap Options
|
||||
- **Template** - Select terrain type
|
||||
- **Custom Image** - Upload heightmap
|
||||
- **Seed** - Reproducible generation
|
||||
|
||||
### World Options
|
||||
- **Cell Count** - Map detail level
|
||||
- **Map Size** - Width and height
|
||||
- **Randomize** - Randomize all settings
|
||||
|
||||
### Culture Options
|
||||
- **Culture Count** - Number of cultures
|
||||
- **Name Bases** - Language/naming styles
|
||||
|
||||
### State Options
|
||||
- **State Count** - Number of states
|
||||
- **Expansionism** - Aggression levels
|
||||
|
||||
### Population Options
|
||||
- **Urban Density** - City frequency
|
||||
- **Rural Density** - Population spread
|
||||
|
||||
## Procedural Name Generation
|
||||
|
||||
**File:** `modules/names-generator.js`
|
||||
**Algorithm:** Markov Chains
|
||||
|
||||
```javascript
|
||||
Names.generate(base, type) {
|
||||
const chain = nameBases[base];
|
||||
const name = markovGenerate(chain, type);
|
||||
return name;
|
||||
}
|
||||
```
|
||||
|
||||
**Name Bases:**
|
||||
Each culture has a name base (e.g., "English", "Arabic", "Chinese") used to generate:
|
||||
- Burg names (e.g., "Oakshire", "Riverton")
|
||||
- Province names
|
||||
- Character names
|
||||
- Geographic feature names
|
||||
|
||||
**Markov Chains:**
|
||||
- Learns patterns from example names
|
||||
- Generates new names matching the style
|
||||
- Produces authentic-sounding results
|
||||
|
||||
## Randomization & Seeds
|
||||
|
||||
**Seed Format:**
|
||||
- Short alphanumeric string
|
||||
- Example: "abc123"
|
||||
|
||||
**Determinism:**
|
||||
- Same seed = identical map
|
||||
- Allows sharing maps by seed
|
||||
- Useful for debugging
|
||||
|
||||
**Randomization:**
|
||||
Uses custom PRNG (Alea) for:
|
||||
- Cross-platform consistency
|
||||
- Save/load reliability
|
||||
- Reproducible generation
|
||||
|
||||
## Performance Optimization
|
||||
|
||||
### Generation Speed
|
||||
|
||||
**Fast Operations:**
|
||||
- Grid generation (~100ms)
|
||||
- Heightmap (~200ms)
|
||||
- Climate (~50ms)
|
||||
|
||||
**Slow Operations:**
|
||||
- River generation (~500ms+)
|
||||
- Culture expansion (~300ms)
|
||||
- State generation (~400ms)
|
||||
|
||||
**Total Time:** ~2-5 seconds for full map
|
||||
|
||||
### Optimization Techniques
|
||||
|
||||
1. **Typed Arrays** - Memory-efficient storage
|
||||
2. **Minimal Reflows** - Batch DOM updates
|
||||
3. **Incremental Rendering** - Progressive display
|
||||
4. **Spatial Indexing** - Fast neighbor lookups
|
||||
5. **Caching** - Reuse calculated values
|
||||
|
||||
## Troubleshooting Generation Issues
|
||||
|
||||
### Common Problems
|
||||
|
||||
**No Rivers Generating:**
|
||||
- Check precipitation settings
|
||||
- Ensure adequate elevation gradients
|
||||
- Verify template allows rivers
|
||||
|
||||
**States Not Forming:**
|
||||
- Increase culture count
|
||||
- Check biome habitability
|
||||
- Ensure enough land area
|
||||
|
||||
**Performance Issues:**
|
||||
- Reduce cell count
|
||||
- Simplify heightmap
|
||||
- Disable unused features
|
||||
|
||||
For more help, see [Performance Tips](https://github.com/Azgaar/Fantasy-Map-Generator/wiki/Tips#performance-tips).
|
||||
|
||||
## Next Steps
|
||||
|
||||
- [Data Model](Data-Model.md) - Understanding the data structures
|
||||
- [Modules Reference](Modules-Reference.md) - Detailed module documentation
|
||||
- [Architecture](Architecture.md) - System design overview
|
||||
780
wiki/Getting-Started.md
Normal file
780
wiki/Getting-Started.md
Normal file
|
|
@ -0,0 +1,780 @@
|
|||
# Getting Started
|
||||
|
||||
Welcome! This guide will help you get started with the Fantasy Map Generator, whether you're a user wanting to create maps or a developer wanting to contribute.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
1. [For Users](#for-users)
|
||||
2. [For Developers](#for-developers)
|
||||
3. [Quick Start Tutorial](#quick-start-tutorial)
|
||||
4. [Contributing](#contributing)
|
||||
5. [Resources](#resources)
|
||||
|
||||
---
|
||||
|
||||
## For Users
|
||||
|
||||
### Using the Online Version
|
||||
|
||||
The easiest way to use the Fantasy Map Generator is through the web application:
|
||||
|
||||
**Link:** [azgaar.github.io/Fantasy-Map-Generator](https://azgaar.github.io/Fantasy-Map-Generator)
|
||||
|
||||
**Requirements:**
|
||||
- Modern web browser (Chrome, Firefox, Safari, or Edge)
|
||||
- JavaScript enabled
|
||||
- Recommended: Desktop or laptop (mobile works but with limitations)
|
||||
|
||||
**No installation needed!** Just open the link and start generating maps.
|
||||
|
||||
---
|
||||
|
||||
### Using the Desktop Version
|
||||
|
||||
For offline use or better performance, download the Electron desktop application:
|
||||
|
||||
**Download:** [GitHub Releases](https://github.com/Azgaar/Fantasy-Map-Generator/releases)
|
||||
|
||||
**Installation:**
|
||||
|
||||
1. Go to the releases page
|
||||
2. Download the archive for your platform:
|
||||
- **Windows**: `FMG-windows-x64.zip`
|
||||
- **macOS**: `FMG-darwin-x64.zip`
|
||||
- **Linux**: `FMG-linux-x64.zip`
|
||||
3. Extract the archive
|
||||
4. Run the executable:
|
||||
- **Windows**: `FMG.exe`
|
||||
- **macOS**: `FMG.app`
|
||||
- **Linux**: `FMG`
|
||||
|
||||
**Benefits:**
|
||||
- Works offline
|
||||
- Better performance
|
||||
- No browser limitations
|
||||
- Easier file management
|
||||
|
||||
---
|
||||
|
||||
### Creating Your First Map
|
||||
|
||||
**Step 1: Open the Generator**
|
||||
|
||||
Visit the website or open the desktop app.
|
||||
|
||||
**Step 2: Generate**
|
||||
|
||||
Click the **"Generate New Map"** button (or it generates automatically on first load).
|
||||
|
||||
**Step 3: Explore**
|
||||
|
||||
Your map is ready! You'll see:
|
||||
- Terrain with mountains, plains, and water
|
||||
- Rivers and lakes
|
||||
- Political boundaries (states)
|
||||
- Cities and towns
|
||||
- Labels and names
|
||||
|
||||
**Step 4: Customize**
|
||||
|
||||
Use the toolbar to:
|
||||
- Toggle layers on/off
|
||||
- Zoom and pan
|
||||
- Open editors to modify the map
|
||||
- Change visual style
|
||||
|
||||
**Step 5: Save**
|
||||
|
||||
Click **File → Save Map** to download your map as a `.map` file.
|
||||
|
||||
**Congratulations!** You've created your first fantasy map.
|
||||
|
||||
---
|
||||
|
||||
### Basic Controls
|
||||
|
||||
**Mouse Controls:**
|
||||
- **Left Click**: Select elements
|
||||
- **Right Click**: Context menu (in editors)
|
||||
- **Drag**: Pan the map
|
||||
- **Scroll**: Zoom in/out
|
||||
- **Hover**: Show tooltips
|
||||
|
||||
**Keyboard Shortcuts:**
|
||||
- **Ctrl+Z**: Undo
|
||||
- **Ctrl+Y**: Redo
|
||||
- **Ctrl+S**: Save
|
||||
- **Ctrl+O**: Open
|
||||
- **F11**: Fullscreen
|
||||
- **Space**: Toggle pan mode
|
||||
|
||||
---
|
||||
|
||||
### Common Tasks
|
||||
|
||||
#### Changing Terrain
|
||||
|
||||
1. Click **Layers → Heightmap**
|
||||
2. Click **Edit Heightmap**
|
||||
3. Use brush tools to raise/lower terrain
|
||||
4. Click **Apply**
|
||||
|
||||
#### Adding a City
|
||||
|
||||
1. Click **Layers → Burgs**
|
||||
2. Click **Add Burg**
|
||||
3. Click on map where you want the city
|
||||
4. Fill in name and details
|
||||
5. Click **Add**
|
||||
|
||||
#### Customizing Colors
|
||||
|
||||
1. Click **Style → Edit Style**
|
||||
2. Select element to customize (states, terrain, etc.)
|
||||
3. Choose colors
|
||||
4. Click **Apply**
|
||||
|
||||
#### Exporting
|
||||
|
||||
1. Click **File → Export**
|
||||
2. Choose format (SVG, PNG, etc.)
|
||||
3. Configure options
|
||||
4. Click **Export**
|
||||
|
||||
---
|
||||
|
||||
### Learning Resources
|
||||
|
||||
**Official Resources:**
|
||||
- [Wiki](https://github.com/Azgaar/Fantasy-Map-Generator/wiki) - Comprehensive guides
|
||||
- [YouTube Channel](https://www.youtube.com/channel/UCb0_JfUg6t2k_dYuLBrGg_g) - Video tutorials
|
||||
- [Blog](https://azgaar.wordpress.com) - Articles and tips
|
||||
|
||||
**Community:**
|
||||
- [Discord](https://discordapp.com/invite/X7E84HU) - Live chat and support
|
||||
- [Reddit](https://www.reddit.com/r/FantasyMapGenerator) - Share maps and discuss
|
||||
|
||||
**Examples:**
|
||||
- [Gallery](https://www.reddit.com/r/FantasyMapGenerator/search?q=flair%3AShowcase&restrict_sr=1) - Community maps for inspiration
|
||||
|
||||
---
|
||||
|
||||
## For Developers
|
||||
|
||||
### Setting Up Development Environment
|
||||
|
||||
#### Prerequisites
|
||||
|
||||
- **Git** - Version control
|
||||
- **Modern Browser** - Chrome/Firefox with DevTools
|
||||
- **Text Editor** - VS Code, Sublime, Atom, etc.
|
||||
- **Optional**: Node.js (for local server)
|
||||
|
||||
#### Clone the Repository
|
||||
|
||||
```bash
|
||||
git clone https://github.com/Azgaar/Fantasy-Map-Generator.git
|
||||
cd Fantasy-Map-Generator
|
||||
```
|
||||
|
||||
#### Run Locally
|
||||
|
||||
**Option 1: Python Server**
|
||||
|
||||
```bash
|
||||
# Python 3
|
||||
python -m http.server 8080
|
||||
|
||||
# Python 2
|
||||
python -m SimpleHTTPServer 8080
|
||||
```
|
||||
|
||||
**Option 2: Node.js Server**
|
||||
|
||||
```bash
|
||||
npx http-server -p 8080
|
||||
```
|
||||
|
||||
**Option 3: VS Code Live Server**
|
||||
|
||||
1. Install "Live Server" extension
|
||||
2. Right-click `index.html`
|
||||
3. Select "Open with Live Server"
|
||||
|
||||
**Option 4: Direct File Access**
|
||||
|
||||
Open `index.html` directly in browser (some features may not work due to CORS).
|
||||
|
||||
#### Access the Application
|
||||
|
||||
Open your browser and navigate to:
|
||||
```
|
||||
http://localhost:8080
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Project Structure
|
||||
|
||||
```
|
||||
Fantasy-Map-Generator/
|
||||
├── index.html # Main HTML file
|
||||
├── index.css # Main stylesheet
|
||||
├── main.js # Core application logic
|
||||
├── versioning.js # Map version migration
|
||||
├── modules/ # Feature modules
|
||||
│ ├── heightmap-generator.js
|
||||
│ ├── river-generator.js
|
||||
│ ├── cultures-generator.js
|
||||
│ ├── burgs-and-states.js
|
||||
│ ├── religions-generator.js
|
||||
│ ├── routes-generator.js
|
||||
│ ├── military-generator.js
|
||||
│ ├── markers-generator.js
|
||||
│ ├── names-generator.js
|
||||
│ ├── coa-generator.js
|
||||
│ ├── coa-renderer.js
|
||||
│ ├── biomes.js
|
||||
│ ├── lakes.js
|
||||
│ ├── voronoi.js
|
||||
│ ├── fonts.js
|
||||
│ ├── relief-icons.js
|
||||
│ ├── ocean-layers.js
|
||||
│ ├── io/ # Save/load/export
|
||||
│ ├── ui/ # 41+ editor dialogs
|
||||
│ ├── renderers/ # Visualization
|
||||
│ └── dynamic/ # On-demand utilities
|
||||
├── libs/ # Third-party libraries
|
||||
│ ├── d3.min.js
|
||||
│ ├── delaunator.min.js
|
||||
│ ├── jquery.min.js
|
||||
│ └── jquery-ui.min.js
|
||||
├── utils/ # Utility functions
|
||||
├── config/ # Configuration files
|
||||
├── styles/ # Additional stylesheets
|
||||
├── images/ # Image assets
|
||||
├── charges/ # Heraldic charges (200+)
|
||||
└── heightmaps/ # Template heightmaps
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Making Your First Change
|
||||
|
||||
#### Example: Changing Default Sea Level
|
||||
|
||||
**File:** `modules/heightmap-generator.js`
|
||||
|
||||
**Find:**
|
||||
```javascript
|
||||
const seaLevel = 20; // Default sea level
|
||||
```
|
||||
|
||||
**Change to:**
|
||||
```javascript
|
||||
const seaLevel = 25; // Raised sea level
|
||||
```
|
||||
|
||||
**Save and reload** - Sea level is now higher.
|
||||
|
||||
---
|
||||
|
||||
### Development Workflow
|
||||
|
||||
#### 1. Create a Branch
|
||||
|
||||
```bash
|
||||
git checkout -b feature/my-feature
|
||||
```
|
||||
|
||||
#### 2. Make Changes
|
||||
|
||||
Edit files in your preferred editor.
|
||||
|
||||
#### 3. Test Changes
|
||||
|
||||
- Reload the browser
|
||||
- Test affected features
|
||||
- Check browser console for errors
|
||||
|
||||
#### 4. Commit Changes
|
||||
|
||||
```bash
|
||||
git add .
|
||||
git commit -m "Add description of changes"
|
||||
```
|
||||
|
||||
#### 5. Push Branch
|
||||
|
||||
```bash
|
||||
git push origin feature/my-feature
|
||||
```
|
||||
|
||||
#### 6. Create Pull Request
|
||||
|
||||
1. Go to GitHub repository
|
||||
2. Click "Pull Requests"
|
||||
3. Click "New Pull Request"
|
||||
4. Select your branch
|
||||
5. Describe changes
|
||||
6. Submit
|
||||
|
||||
---
|
||||
|
||||
### Code Style Guidelines
|
||||
|
||||
#### JavaScript Style
|
||||
|
||||
**Use strict mode:**
|
||||
```javascript
|
||||
"use strict";
|
||||
```
|
||||
|
||||
**Module pattern:**
|
||||
```javascript
|
||||
window.MyModule = (function() {
|
||||
// Private
|
||||
function privateFunction() {}
|
||||
|
||||
// Public
|
||||
function publicFunction() {}
|
||||
|
||||
return { publicFunction };
|
||||
})();
|
||||
```
|
||||
|
||||
**Naming conventions:**
|
||||
- Variables: `camelCase`
|
||||
- Constants: `UPPER_SNAKE_CASE`
|
||||
- Functions: `camelCase`
|
||||
- Modules: `PascalCase`
|
||||
|
||||
**Comments:**
|
||||
```javascript
|
||||
// Single-line for brief explanations
|
||||
|
||||
/* Multi-line for
|
||||
longer explanations */
|
||||
```
|
||||
|
||||
#### Formatting
|
||||
|
||||
- **Indentation**: 2 spaces (no tabs)
|
||||
- **Semicolons**: Use them
|
||||
- **Quotes**: Prefer double quotes
|
||||
- **Line length**: ~100 characters
|
||||
|
||||
#### Best Practices
|
||||
|
||||
1. **No global pollution** - Use modules
|
||||
2. **Use typed arrays** for cell data
|
||||
3. **Cache DOM selections** - Don't query repeatedly
|
||||
4. **Minimize D3 updates** - Batch when possible
|
||||
5. **Comment complex logic** - Help future maintainers
|
||||
|
||||
---
|
||||
|
||||
### Understanding the Codebase
|
||||
|
||||
#### Key Concepts
|
||||
|
||||
**1. Global State**
|
||||
|
||||
```javascript
|
||||
grid // Voronoi diagram + terrain
|
||||
pack // Civilizations + derived data
|
||||
seed // Random seed
|
||||
```
|
||||
|
||||
All modules access these globals.
|
||||
|
||||
**2. Generation Pipeline**
|
||||
|
||||
```javascript
|
||||
generateGrid()
|
||||
→ generateHeightmap()
|
||||
→ markFeatures()
|
||||
→ calculateClimate()
|
||||
→ generateRivers()
|
||||
→ defineBiomes()
|
||||
→ generateCultures()
|
||||
→ generateStates()
|
||||
→ render()
|
||||
```
|
||||
|
||||
Each step builds on the previous.
|
||||
|
||||
**3. Data Structures**
|
||||
|
||||
Heavily uses typed arrays:
|
||||
```javascript
|
||||
pack.cells.h = new Uint8Array(n); // Heights
|
||||
pack.cells.s = new Uint16Array(n); // State IDs
|
||||
```
|
||||
|
||||
See [Data Model](Data-Model.md) for details.
|
||||
|
||||
**4. Rendering**
|
||||
|
||||
Uses D3.js for SVG manipulation:
|
||||
```javascript
|
||||
d3.select('#states').selectAll('path')
|
||||
.data(pack.states)
|
||||
.enter().append('path')
|
||||
.attr('d', drawStatePath)
|
||||
.attr('fill', d => d.color);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Debugging Tips
|
||||
|
||||
#### Browser DevTools
|
||||
|
||||
**Console:**
|
||||
- View errors and warnings
|
||||
- Log values: `console.log(grid)`
|
||||
- Inspect objects: `console.dir(pack.states[0])`
|
||||
|
||||
**Debugger:**
|
||||
- Set breakpoints in sources
|
||||
- Step through code
|
||||
- Inspect variables
|
||||
|
||||
**Performance:**
|
||||
- Profile generation
|
||||
- Identify slow functions
|
||||
- Monitor memory usage
|
||||
|
||||
#### Common Issues
|
||||
|
||||
**Problem: Changes not appearing**
|
||||
- Hard refresh (Ctrl+Shift+R)
|
||||
- Clear browser cache
|
||||
- Check console for errors
|
||||
|
||||
**Problem: Map not generating**
|
||||
- Check console for errors
|
||||
- Verify module loading order
|
||||
- Test with lower cell count
|
||||
|
||||
**Problem: Performance issues**
|
||||
- Reduce cell count
|
||||
- Profile in DevTools
|
||||
- Check for infinite loops
|
||||
|
||||
---
|
||||
|
||||
### Testing
|
||||
|
||||
Currently, the project lacks automated tests. Manual testing is required:
|
||||
|
||||
#### Test Checklist
|
||||
|
||||
- [ ] Map generates successfully
|
||||
- [ ] All layers render correctly
|
||||
- [ ] Editors open without errors
|
||||
- [ ] Changes persist after save/load
|
||||
- [ ] Export formats work
|
||||
- [ ] No console errors
|
||||
|
||||
#### Test Different Scenarios
|
||||
|
||||
- Different templates
|
||||
- Different cell counts
|
||||
- Edge cases (very high/low values)
|
||||
- Browser compatibility
|
||||
|
||||
---
|
||||
|
||||
## Quick Start Tutorial
|
||||
|
||||
### Tutorial: Adding a Custom Biome
|
||||
|
||||
This tutorial shows how to add a new biome type called "Jungle".
|
||||
|
||||
**Step 1: Define Biome Data**
|
||||
|
||||
Edit `modules/biomes.js`:
|
||||
|
||||
```javascript
|
||||
// Add to biomesData.i array
|
||||
14 // New ID for Jungle
|
||||
|
||||
// Add to biomesData.name array
|
||||
"Jungle"
|
||||
|
||||
// Add to biomesData.color array
|
||||
"#2d5016" // Dark green
|
||||
|
||||
// Add to biomesData.habitability array
|
||||
50 // Medium habitability
|
||||
|
||||
// Add to other arrays...
|
||||
```
|
||||
|
||||
**Step 2: Update Biome Matrix**
|
||||
|
||||
Add logic to assign "Jungle" biome:
|
||||
|
||||
```javascript
|
||||
// In high temp + high precipitation
|
||||
if (temp > 80 && prec > 200) {
|
||||
return 14; // Jungle
|
||||
}
|
||||
```
|
||||
|
||||
**Step 3: Test**
|
||||
|
||||
1. Reload the application
|
||||
2. Generate a new map
|
||||
3. Look for jungle biomes in hot, wet regions
|
||||
4. Check if rendering works correctly
|
||||
|
||||
**Step 4: Add Icons (Optional)**
|
||||
|
||||
Add jungle-specific relief icons in `modules/relief-icons.js`.
|
||||
|
||||
**Congratulations!** You've added a custom biome.
|
||||
|
||||
---
|
||||
|
||||
### Tutorial: Creating a Simple Editor
|
||||
|
||||
This tutorial shows how to create a basic editor dialog.
|
||||
|
||||
**Step 1: Create Editor File**
|
||||
|
||||
Create `modules/ui/my-editor.js`:
|
||||
|
||||
```javascript
|
||||
"use strict";
|
||||
|
||||
function editMyFeature() {
|
||||
// Create dialog
|
||||
$("#myEditor").dialog({
|
||||
title: "My Feature Editor",
|
||||
width: 400,
|
||||
height: 300,
|
||||
buttons: {
|
||||
Apply: applyChanges,
|
||||
Close: function() { $(this).dialog("close"); }
|
||||
}
|
||||
});
|
||||
|
||||
function applyChanges() {
|
||||
// Implement your logic
|
||||
const value = $("#myInput").val();
|
||||
console.log("Applied:", value);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Step 2: Add HTML Dialog**
|
||||
|
||||
In `index.html`, add:
|
||||
|
||||
```html
|
||||
<div id="myEditor" class="dialog">
|
||||
<label>My Setting:</label>
|
||||
<input id="myInput" type="text" />
|
||||
</div>
|
||||
```
|
||||
|
||||
**Step 3: Include Script**
|
||||
|
||||
In `index.html`, add:
|
||||
|
||||
```html
|
||||
<script src="modules/ui/my-editor.js"></script>
|
||||
```
|
||||
|
||||
**Step 4: Add Menu Item**
|
||||
|
||||
Add button to toolbar or menu to call `editMyFeature()`.
|
||||
|
||||
**Step 5: Test**
|
||||
|
||||
Click the button and verify dialog opens.
|
||||
|
||||
---
|
||||
|
||||
## Contributing
|
||||
|
||||
### Ways to Contribute
|
||||
|
||||
1. **Report Bugs** - Use [GitHub Issues](https://github.com/Azgaar/Fantasy-Map-Generator/issues)
|
||||
2. **Suggest Features** - Use [Discussions](https://github.com/Azgaar/Fantasy-Map-Generator/discussions)
|
||||
3. **Improve Documentation** - Submit PR with doc improvements
|
||||
4. **Fix Bugs** - Pick an issue and submit a fix
|
||||
5. **Add Features** - Implement new functionality
|
||||
6. **Share Maps** - Inspire others on [Reddit](https://www.reddit.com/r/FantasyMapGenerator)
|
||||
|
||||
### Contribution Guidelines
|
||||
|
||||
#### Before Contributing
|
||||
|
||||
1. **Read the documentation**
|
||||
- [Data Model](Data-Model.md)
|
||||
- [Architecture](Architecture.md)
|
||||
- [Generation Process](Generation-Process.md)
|
||||
|
||||
2. **Check existing issues**
|
||||
- Avoid duplicates
|
||||
- Discuss major changes first
|
||||
|
||||
3. **Start small**
|
||||
- Begin with minor changes
|
||||
- Get familiar with codebase
|
||||
- Build up to larger features
|
||||
|
||||
#### Pull Request Process
|
||||
|
||||
1. **Fork the repository**
|
||||
2. **Create a branch** (`feature/my-feature`)
|
||||
3. **Make changes** with clear commits
|
||||
4. **Test thoroughly**
|
||||
5. **Update documentation** if needed
|
||||
6. **Submit pull request** with clear description
|
||||
7. **Respond to feedback**
|
||||
|
||||
#### Code Review
|
||||
|
||||
Maintainers will review your PR and may:
|
||||
- Request changes
|
||||
- Suggest improvements
|
||||
- Merge if approved
|
||||
|
||||
Be patient and receptive to feedback!
|
||||
|
||||
---
|
||||
|
||||
### Community Guidelines
|
||||
|
||||
**Be respectful:**
|
||||
- Kind and constructive communication
|
||||
- Welcome newcomers
|
||||
- Help others learn
|
||||
|
||||
**Stay on topic:**
|
||||
- Keep discussions relevant
|
||||
- Use appropriate channels
|
||||
|
||||
**Share knowledge:**
|
||||
- Document your solutions
|
||||
- Help others with issues
|
||||
- Create tutorials
|
||||
|
||||
**Follow the Code of Conduct:**
|
||||
See [CODE_OF_CONDUCT.md](../CODE_OF_CONDUCT.md)
|
||||
|
||||
---
|
||||
|
||||
## Resources
|
||||
|
||||
### Documentation
|
||||
|
||||
- **[Home](Home.md)** - Wiki home
|
||||
- **[Architecture](Architecture.md)** - System design
|
||||
- **[Data Model](Data-Model.md)** - Data structures
|
||||
- **[Generation Process](Generation-Process.md)** - How maps are created
|
||||
- **[Modules Reference](Modules-Reference.md)** - Module documentation
|
||||
- **[Features and UI](Features-and-UI.md)** - Feature guide
|
||||
|
||||
### External Resources
|
||||
|
||||
**Inspiration:**
|
||||
- [Generating Fantasy Maps](https://mewo2.com/notes/terrain) - Martin O'Leary
|
||||
- [Polygonal Map Generation](http://www-cs-students.stanford.edu/~amitp/game-programming/polygon-map-generation) - Amit Patel
|
||||
- [Here Dragons Abound](https://heredragonsabound.blogspot.com) - Scott Turner
|
||||
|
||||
**Tools:**
|
||||
- [D3.js Documentation](https://d3js.org/)
|
||||
- [SVG Reference](https://developer.mozilla.org/en-US/docs/Web/SVG)
|
||||
- [Delaunator](https://github.com/mapbox/delaunator)
|
||||
|
||||
### Getting Help
|
||||
|
||||
**Questions?**
|
||||
- Ask on [Discord](https://discordapp.com/invite/X7E84HU)
|
||||
- Post on [Reddit](https://www.reddit.com/r/FantasyMapGenerator)
|
||||
- Search [GitHub Issues](https://github.com/Azgaar/Fantasy-Map-Generator/issues)
|
||||
|
||||
**Bug Reports?**
|
||||
- Use [GitHub Issues](https://github.com/Azgaar/Fantasy-Map-Generator/issues)
|
||||
- Include steps to reproduce
|
||||
- Provide browser/version info
|
||||
- Share console errors
|
||||
|
||||
**Feature Requests?**
|
||||
- Use [Discussions](https://github.com/Azgaar/Fantasy-Map-Generator/discussions)
|
||||
- Describe use case
|
||||
- Explain expected behavior
|
||||
|
||||
**Private Inquiries?**
|
||||
- Email: azgaar.fmg@yandex.by
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
### For Users
|
||||
|
||||
1. **Experiment** - Try different templates and options
|
||||
2. **Explore editors** - Customize every aspect
|
||||
3. **Share your maps** - Post to community
|
||||
4. **Learn advanced features** - 3D view, submaps, etc.
|
||||
|
||||
### For Developers
|
||||
|
||||
1. **Read the codebase** - Explore key modules
|
||||
2. **Make small changes** - Build confidence
|
||||
3. **Fix a bug** - Pick from issues
|
||||
4. **Add a feature** - Implement something new
|
||||
5. **Improve docs** - Help others learn
|
||||
|
||||
---
|
||||
|
||||
## Welcome to the Community!
|
||||
|
||||
Whether you're creating maps for your D&D campaign, writing a fantasy novel, or contributing code, we're glad you're here!
|
||||
|
||||
**Happy mapping!** 🗺️
|
||||
|
||||
---
|
||||
|
||||
## FAQ
|
||||
|
||||
**Q: Is it really free?**
|
||||
A: Yes! Completely free and open source.
|
||||
|
||||
**Q: Can I use maps commercially?**
|
||||
A: Yes! The MIT license allows commercial use.
|
||||
|
||||
**Q: Do I need to credit the generator?**
|
||||
A: Not required, but appreciated!
|
||||
|
||||
**Q: Can I run it offline?**
|
||||
A: Yes, use the desktop version or host locally.
|
||||
|
||||
**Q: How do I report bugs?**
|
||||
A: Use [GitHub Issues](https://github.com/Azgaar/Fantasy-Map-Generator/issues).
|
||||
|
||||
**Q: Can I contribute if I'm new to coding?**
|
||||
A: Absolutely! Start with documentation or small bug fixes.
|
||||
|
||||
**Q: Where can I see examples?**
|
||||
A: Check the [Reddit community](https://www.reddit.com/r/FantasyMapGenerator) for amazing maps!
|
||||
|
||||
**Q: Is there a mobile app?**
|
||||
A: Not currently, but the web version works on mobile browsers.
|
||||
|
||||
**Q: Can I import my own data?**
|
||||
A: Yes, see export/import features for JSON data.
|
||||
|
||||
**Q: How can I support the project?**
|
||||
A: [Patreon](https://www.patreon.com/azgaar) or contribute code!
|
||||
|
||||
---
|
||||
|
||||
For more questions, visit the community channels!
|
||||
105
wiki/Home.md
Normal file
105
wiki/Home.md
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
# Fantasy Map Generator Wiki
|
||||
|
||||
Welcome to the Fantasy Map Generator documentation! This wiki provides comprehensive information about how the generator works, its architecture, and how to use and contribute to the project.
|
||||
|
||||
## What is 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. It uses procedural generation to create realistic-looking maps with terrain, water features, climates, civilizations, and much more.
|
||||
|
||||
**Live Application:** [azgaar.github.io/Fantasy-Map-Generator](https://azgaar.github.io/Fantasy-Map-Generator)
|
||||
|
||||
## Key Features
|
||||
|
||||
- **Procedural Terrain Generation** - Realistic heightmaps, mountains, hills, and valleys
|
||||
- **Water Simulation** - Rivers flow naturally based on elevation, lakes form in depressions
|
||||
- **Climate System** - Temperature and precipitation affect biome distribution
|
||||
- **Civilization Generation** - Cultures, states, religions, towns, and political boundaries
|
||||
- **Extensive Customization** - 41+ specialized editors for every aspect of the map
|
||||
- **Export Options** - Save/load maps, export to various formats
|
||||
- **Procedural Naming** - Realistic place names using Markov chains
|
||||
- **Coat of Arms** - Procedurally generated heraldry for states
|
||||
|
||||
## Documentation Structure
|
||||
|
||||
This wiki is organized into the following sections:
|
||||
|
||||
### Core Concepts
|
||||
|
||||
- **[Architecture](Architecture.md)** - High-level system architecture and design patterns
|
||||
- **[Data Model](Data-Model.md)** - Data structures, objects, and relationships
|
||||
- **[Generation Process](Generation-Process.md)** - How maps are generated step-by-step
|
||||
|
||||
### Reference Documentation
|
||||
|
||||
- **[Modules Reference](Modules-Reference.md)** - Detailed documentation of all modules
|
||||
- **[Features and UI](Features-and-UI.md)** - Complete feature list and UI capabilities
|
||||
- **[Getting Started](Getting-Started.md)** - Quick start guide for developers
|
||||
|
||||
### Additional Resources
|
||||
|
||||
- **[GitHub Repository](https://github.com/Azgaar/Fantasy-Map-Generator)** - Source code
|
||||
- **[Discord Community](https://discordapp.com/invite/X7E84HU)** - Join the community
|
||||
- **[Reddit Community](https://www.reddit.com/r/FantasyMapGenerator)** - Share your maps
|
||||
- **[Trello Board](https://trello.com/b/7x832DG4/fantasy-map-generator)** - Development progress
|
||||
- **[Patreon](https://www.patreon.com/azgaar)** - Support the project
|
||||
|
||||
## Quick Overview
|
||||
|
||||
### How It Works
|
||||
|
||||
The generator creates maps through a multi-stage process:
|
||||
|
||||
1. **Grid Generation** - Creates a Voronoi diagram from jittered points
|
||||
2. **Terrain Creation** - Generates heightmap using templates or images
|
||||
3. **Climate Simulation** - Calculates temperature and precipitation
|
||||
4. **Water Features** - Generates rivers and lakes based on elevation
|
||||
5. **Biomes** - Assigns vegetation types based on climate
|
||||
6. **Civilization** - Places cultures, states, and settlements
|
||||
7. **Infrastructure** - Creates roads and trade routes
|
||||
8. **Rendering** - Draws all elements to an SVG canvas
|
||||
|
||||
### Technology Stack
|
||||
|
||||
- **Pure JavaScript** - No build system required
|
||||
- **D3.js** - Data visualization and SVG manipulation
|
||||
- **Delaunator** - Fast Delaunay triangulation
|
||||
- **jQuery/jQuery UI** - UI components and interactions
|
||||
- **SVG** - Vector graphics rendering
|
||||
- **Typed Arrays** - Efficient data storage
|
||||
|
||||
### Data Model Overview
|
||||
|
||||
The generator maintains two main data structures:
|
||||
|
||||
- **`grid`** - Initial Voronoi graph (~10,000 cells) with terrain and climate data
|
||||
- **`pack`** - Packed graph with civilizations, settlements, and derived features
|
||||
|
||||
All map data is stored in these objects, enabling save/load functionality and full editability.
|
||||
|
||||
## Contributing
|
||||
|
||||
Pull requests are highly welcomed! Before contributing:
|
||||
|
||||
1. Read the [Data Model](Data-Model.md) documentation
|
||||
2. Review the [Architecture](Architecture.md) guide
|
||||
3. Start with minor changes to familiarize yourself with the codebase
|
||||
4. Check existing [issues](https://github.com/Azgaar/Fantasy-Map-Generator/issues) and [discussions](https://github.com/Azgaar/Fantasy-Map-Generator/discussions)
|
||||
|
||||
## Getting Help
|
||||
|
||||
- **Bug Reports** - Use [GitHub Issues](https://github.com/Azgaar/Fantasy-Map-Generator/issues) or Discord #bugs channel
|
||||
- **Questions** - Ask on [Discord](https://discordapp.com/invite/X7E84HU) or [Reddit](https://www.reddit.com/r/FantasyMapGenerator)
|
||||
- **Performance Issues** - See [Performance Tips](https://github.com/Azgaar/Fantasy-Map-Generator/wiki/Tips#performance-tips)
|
||||
- **Private Inquiries** - Email: azgaar.fmg@yandex.by
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the MIT License - see the [LICENSE](../LICENSE) file for details.
|
||||
|
||||
## Acknowledgments
|
||||
|
||||
This project was inspired by:
|
||||
|
||||
- Martin O'Leary's [Generating fantasy maps](https://mewo2.com/notes/terrain)
|
||||
- Amit Patel's [Polygonal Map Generation for Games](http://www-cs-students.stanford.edu/~amitp/game-programming/polygon-map-generation)
|
||||
- Scott Turner's [Here Dragons Abound](https://heredragonsabound.blogspot.com)
|
||||
880
wiki/Modules-Reference.md
Normal file
880
wiki/Modules-Reference.md
Normal file
|
|
@ -0,0 +1,880 @@
|
|||
# Modules Reference
|
||||
|
||||
This document provides detailed information about each module in the Fantasy Map Generator, including their purpose, main functions, and usage.
|
||||
|
||||
## Module Organization
|
||||
|
||||
Modules are located in the `modules/` directory and organized into categories:
|
||||
|
||||
```
|
||||
modules/
|
||||
├── Core Generators (terrain, water, biomes)
|
||||
├── Civilization Generators (cultures, states, religions)
|
||||
├── Utility Generators (names, routes, military)
|
||||
├── Renderers (visualization)
|
||||
├── io/ (save/load/export)
|
||||
├── ui/ (editors and dialogs)
|
||||
└── dynamic/ (runtime utilities)
|
||||
```
|
||||
|
||||
## Core Generator Modules
|
||||
|
||||
### heightmap-generator.js
|
||||
|
||||
**Purpose:** Generates terrain elevation for the map.
|
||||
|
||||
**Main Functions:**
|
||||
|
||||
```javascript
|
||||
HeightmapGenerator.generate()
|
||||
// Generates heightmap using selected template or custom image
|
||||
|
||||
HeightmapGenerator.applyTemplate(template)
|
||||
// Applies a specific template (Pangea, Archipelago, etc.)
|
||||
|
||||
HeightmapGenerator.fromImage(imageData)
|
||||
// Creates heightmap from uploaded image
|
||||
```
|
||||
|
||||
**Templates Available:**
|
||||
- Pangea - Single supercontinent
|
||||
- Continents - Multiple landmasses
|
||||
- Archipelago - Many islands
|
||||
- Atoll - Ring-shaped island
|
||||
- Volcano - Volcanic island
|
||||
- High Island - Mountainous island
|
||||
- Low Island - Flat coral island
|
||||
- Mediterranean - Central sea with surrounding land
|
||||
- Peninsula - Land extending into water
|
||||
- Isthmus - Narrow land bridge
|
||||
|
||||
**Usage:**
|
||||
```javascript
|
||||
// Generate default heightmap
|
||||
await HeightmapGenerator.generate();
|
||||
|
||||
// Use specific template
|
||||
HeightmapGenerator.template = "Archipelago";
|
||||
await HeightmapGenerator.generate();
|
||||
```
|
||||
|
||||
**Location in Pipeline:** Step 3 (after grid generation)
|
||||
|
||||
---
|
||||
|
||||
### river-generator.js
|
||||
|
||||
**Purpose:** Generates realistic river networks based on elevation and precipitation.
|
||||
|
||||
**Main Functions:**
|
||||
|
||||
```javascript
|
||||
Rivers.generate()
|
||||
// Main generation function - creates all rivers
|
||||
|
||||
Rivers.calculateFlux()
|
||||
// Calculates water accumulation in each cell
|
||||
|
||||
Rivers.createMainRivers()
|
||||
// Creates primary river paths
|
||||
|
||||
Rivers.createDowncutting()
|
||||
// Simulates erosion along rivers
|
||||
```
|
||||
|
||||
**Algorithm:**
|
||||
1. Calculate water flux from precipitation
|
||||
2. Flow water downhill to adjacent cells
|
||||
3. Identify high-flux cells as river sources
|
||||
4. Create river paths following gradients
|
||||
5. Apply erosion to create valleys
|
||||
6. Detect confluences and tributaries
|
||||
|
||||
**Data Structure:**
|
||||
```javascript
|
||||
pack.rivers = [
|
||||
{
|
||||
i: 0, // River ID
|
||||
source: 1234, // Source cell
|
||||
mouth: 5678, // Mouth cell
|
||||
cells: [...], // Path cells
|
||||
length: 250, // Length
|
||||
width: 8, // Width
|
||||
name: "River Name"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
**Location in Pipeline:** Step 7 (after climate calculation)
|
||||
|
||||
---
|
||||
|
||||
### biomes.js
|
||||
|
||||
**Purpose:** Assigns biome types based on temperature and precipitation.
|
||||
|
||||
**Main Functions:**
|
||||
|
||||
```javascript
|
||||
Biomes.define()
|
||||
// Assigns biomes to all cells based on climate
|
||||
|
||||
Biomes.getBiome(temperature, precipitation)
|
||||
// Returns biome ID for given climate values
|
||||
```
|
||||
|
||||
**Biome Matrix:**
|
||||
|
||||
The module uses a matrix mapping climate to biomes:
|
||||
|
||||
| Temp\Prec | Very Dry | Dry | Wet | Very Wet |
|
||||
|-----------|----------|-----|-----|----------|
|
||||
| **Very Cold** | Glacier | Tundra | Tundra | Tundra |
|
||||
| **Cold** | Cold Desert | Taiga | Taiga | Wetland |
|
||||
| **Moderate** | Grassland | Grassland | Temp. Forest | Temp. Rainforest |
|
||||
| **Warm** | Hot Desert | Savanna | Trop. Forest | Tropical Rainforest |
|
||||
|
||||
**Biome Data:**
|
||||
```javascript
|
||||
biomesData = {
|
||||
i: [1, 2, 3, ...], // IDs
|
||||
name: ["Marine", "Hot desert", ...],
|
||||
color: ["#53679f", "#fbe79f", ...],
|
||||
habitability: [0, 4, 2, ...], // 0-100
|
||||
iconsDensity: [0, 2, 5, ...],
|
||||
icons: [[], ["dune"], ...]
|
||||
}
|
||||
```
|
||||
|
||||
**Location in Pipeline:** Step 8 (after rivers)
|
||||
|
||||
---
|
||||
|
||||
### lakes.js
|
||||
|
||||
**Purpose:** Manages lake creation and grouping.
|
||||
|
||||
**Main Functions:**
|
||||
|
||||
```javascript
|
||||
Lakes.defineGroup()
|
||||
// Groups adjacent lake cells together
|
||||
|
||||
Lakes.cleanupLakes()
|
||||
// Removes small/invalid lakes
|
||||
|
||||
Lakes.generateName(lakeId)
|
||||
// Creates procedural name for lake
|
||||
```
|
||||
|
||||
**Process:**
|
||||
1. Identify water cells not connected to ocean
|
||||
2. Group adjacent cells into lakes
|
||||
3. Calculate lake properties (area, depth)
|
||||
4. Generate names
|
||||
5. Store in features array
|
||||
|
||||
**Location in Pipeline:** Step 7 (alongside rivers)
|
||||
|
||||
---
|
||||
|
||||
## Civilization Generator Modules
|
||||
|
||||
### cultures-generator.js
|
||||
|
||||
**Purpose:** Creates and expands cultures across the map.
|
||||
|
||||
**Main Functions:**
|
||||
|
||||
```javascript
|
||||
Cultures.generate()
|
||||
// Places initial culture centers
|
||||
|
||||
Cultures.expand()
|
||||
// Expands cultures from centers
|
||||
|
||||
Cultures.add(culture)
|
||||
// Adds a new culture
|
||||
|
||||
Cultures.remove(cultureId)
|
||||
// Removes a culture
|
||||
```
|
||||
|
||||
**Culture Object:**
|
||||
```javascript
|
||||
{
|
||||
i: 1, // Culture ID
|
||||
name: "Elvari",
|
||||
base: 5, // Name base index
|
||||
type: "Generic", // Culture type
|
||||
center: 1234, // Origin cell
|
||||
color: "#3366cc",
|
||||
expansionism: 0.8, // 0-1 expansion rate
|
||||
area: 500, // Total cells
|
||||
rural: 50000, // Rural population
|
||||
urban: 15000, // Urban population
|
||||
code: "EL", // Two-letter code
|
||||
shield: "heater" // Shield shape for CoA
|
||||
}
|
||||
```
|
||||
|
||||
**Expansion Algorithm:**
|
||||
- BFS (breadth-first search) from center
|
||||
- Prioritizes high-habitability cells
|
||||
- Respects expansionism rate
|
||||
- Stops at natural barriers or other cultures
|
||||
|
||||
**Location in Pipeline:** Step 10 (after biomes)
|
||||
|
||||
---
|
||||
|
||||
### burgs-and-states.js
|
||||
|
||||
**Purpose:** Generates settlements (burgs) and political states.
|
||||
|
||||
**Main Functions:**
|
||||
|
||||
```javascript
|
||||
BurgsAndStates.generate()
|
||||
// Main generation - creates capitals and states
|
||||
|
||||
BurgsAndStates.addBurg(cell)
|
||||
// Adds a new settlement
|
||||
|
||||
BurgsAndStates.removeBurg(burgId)
|
||||
// Removes a settlement
|
||||
|
||||
BurgsAndStates.generateProvinces()
|
||||
// Divides states into provinces
|
||||
|
||||
BurgsAndStates.expandStates()
|
||||
// Grows state territories
|
||||
```
|
||||
|
||||
**Burg Object:**
|
||||
```javascript
|
||||
{
|
||||
i: 1,
|
||||
cell: 1234,
|
||||
x: 150,
|
||||
y: 200,
|
||||
name: "Oakshire",
|
||||
feature: 3, // Island ID
|
||||
state: 5,
|
||||
capital: true, // Is capital
|
||||
culture: 2,
|
||||
population: 25000,
|
||||
type: "City",
|
||||
port: 5, // Port value
|
||||
citadel: true
|
||||
}
|
||||
```
|
||||
|
||||
**State Object:**
|
||||
```javascript
|
||||
{
|
||||
i: 1,
|
||||
name: "Kingdom of Oakshire",
|
||||
color: "#ff6633",
|
||||
capital: 1, // Capital burg ID
|
||||
culture: 2,
|
||||
religion: 3,
|
||||
type: "Kingdom",
|
||||
expansionism: 0.7,
|
||||
form: "Monarchy",
|
||||
area: 1000, // Total cells
|
||||
cells: 1000,
|
||||
rural: 100000,
|
||||
urban: 30000,
|
||||
military: [...], // Military units
|
||||
diplomacy: [...] // Relations
|
||||
}
|
||||
```
|
||||
|
||||
**Location in Pipeline:** Step 11 (after cultures)
|
||||
|
||||
---
|
||||
|
||||
### religions-generator.js
|
||||
|
||||
**Purpose:** Creates and spreads religions.
|
||||
|
||||
**Main Functions:**
|
||||
|
||||
```javascript
|
||||
Religions.generate()
|
||||
// Creates religions from cultures
|
||||
|
||||
Religions.expand()
|
||||
// Spreads religions across territory
|
||||
|
||||
Religions.add(religion)
|
||||
// Adds new religion
|
||||
|
||||
Religions.remove(religionId)
|
||||
// Removes religion
|
||||
```
|
||||
|
||||
**Religion Object:**
|
||||
```javascript
|
||||
{
|
||||
i: 1,
|
||||
name: "Church of the Sacred Oak",
|
||||
color: "#ffd700",
|
||||
type: "Organized", // Folk, Organized, Cult, Heresy
|
||||
form: "Church",
|
||||
culture: 2, // Origin culture
|
||||
center: 1234, // Origin cell
|
||||
deity: "Oakfather", // Deity name (if applicable)
|
||||
area: 800,
|
||||
cells: 800,
|
||||
rural: 80000,
|
||||
urban: 25000,
|
||||
expansion: "culture", // Expansion strategy
|
||||
expansionism: 0.5,
|
||||
code: "SO"
|
||||
}
|
||||
```
|
||||
|
||||
**Location in Pipeline:** Step 12 (after states)
|
||||
|
||||
---
|
||||
|
||||
### military-generator.js
|
||||
|
||||
**Purpose:** Creates military units for states.
|
||||
|
||||
**Main Functions:**
|
||||
|
||||
```javascript
|
||||
Military.generate()
|
||||
// Generates military units for all states
|
||||
|
||||
Military.generateForState(stateId)
|
||||
// Generates units for specific state
|
||||
|
||||
Military.createRegiment(state, type)
|
||||
// Creates a single military unit
|
||||
```
|
||||
|
||||
**Military Unit:**
|
||||
```javascript
|
||||
{
|
||||
i: 1,
|
||||
state: 5,
|
||||
name: "Royal Guard",
|
||||
type: "Infantry", // Infantry, Cavalry, Archers, etc.
|
||||
strength: 1000, // Number of soldiers
|
||||
burg: 3, // Stationed at burg
|
||||
icon: "infantry",
|
||||
uIcon: "🗡️"
|
||||
}
|
||||
```
|
||||
|
||||
**Unit Types:**
|
||||
- Infantry (foot soldiers)
|
||||
- Cavalry (mounted)
|
||||
- Archers (ranged)
|
||||
- Artillery (siege weapons)
|
||||
- Fleet (naval)
|
||||
|
||||
**Location in Pipeline:** Step 15 (late generation)
|
||||
|
||||
---
|
||||
|
||||
### routes-generator.js
|
||||
|
||||
**Purpose:** Creates road and sea route networks.
|
||||
|
||||
**Main Functions:**
|
||||
|
||||
```javascript
|
||||
Routes.generate()
|
||||
// Generates all routes
|
||||
|
||||
Routes.generateRoads()
|
||||
// Creates land routes between burgs
|
||||
|
||||
Routes.generateTrails()
|
||||
// Creates secondary paths
|
||||
|
||||
Routes.generateSeaRoutes()
|
||||
// Creates maritime routes
|
||||
```
|
||||
|
||||
**Algorithm:**
|
||||
- Uses modified Dijkstra's algorithm
|
||||
- Considers terrain difficulty
|
||||
- Connects burgs within states
|
||||
- Prioritizes major cities
|
||||
|
||||
**Route Types:**
|
||||
- **Roads** - Major routes between cities
|
||||
- **Trails** - Minor paths
|
||||
- **Sea Routes** - Maritime trade routes
|
||||
|
||||
**Location in Pipeline:** Step 14 (after provinces)
|
||||
|
||||
---
|
||||
|
||||
## Utility Modules
|
||||
|
||||
### names-generator.js
|
||||
|
||||
**Purpose:** Generates procedural names using Markov chains.
|
||||
|
||||
**Main Functions:**
|
||||
|
||||
```javascript
|
||||
Names.generate(base, type)
|
||||
// Generates name from base
|
||||
// base: name base index (0-99+)
|
||||
// type: "burg", "state", "river", etc.
|
||||
|
||||
Names.addBase(baseName, examples)
|
||||
// Adds new name base from examples
|
||||
|
||||
Names.getBase(culture)
|
||||
// Gets name base for culture
|
||||
```
|
||||
|
||||
**Name Bases:**
|
||||
|
||||
Pre-defined bases for different cultures:
|
||||
- English, French, German, Italian, Spanish
|
||||
- Arabic, Chinese, Japanese, Korean
|
||||
- Norse, Celtic, Slavic
|
||||
- Fantasy (Elvish, Dwarven, etc.)
|
||||
|
||||
**Markov Chain:**
|
||||
```javascript
|
||||
// Learns from examples:
|
||||
["London", "Manchester", "Birmingham"]
|
||||
// Generates similar:
|
||||
["Lonchester", "Birmingam", "Manchdon"]
|
||||
```
|
||||
|
||||
**Usage:**
|
||||
```javascript
|
||||
// Generate burg name
|
||||
const name = Names.generate(cultureBase, "burg");
|
||||
|
||||
// Generate state name
|
||||
const stateName = Names.generate(cultureBase, "state");
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### coa-generator.js
|
||||
|
||||
**Purpose:** Procedurally generates coats of arms (heraldry).
|
||||
|
||||
**Main Functions:**
|
||||
|
||||
```javascript
|
||||
COA.generate(entity, type)
|
||||
// Generates coat of arms
|
||||
// entity: state, burg, or province
|
||||
// type: determines complexity
|
||||
|
||||
COA.shield(culture)
|
||||
// Selects shield shape based on culture
|
||||
|
||||
COA.divisions()
|
||||
// Creates field divisions
|
||||
|
||||
COA.charges()
|
||||
// Selects heraldic charges (symbols)
|
||||
```
|
||||
|
||||
**Heraldic Elements:**
|
||||
- **Shield shapes** - Heater, French, Spanish, etc.
|
||||
- **Divisions** - Per pale, per fess, quarterly, etc.
|
||||
- **Charges** - Lions, eagles, crowns, etc. (200+ options)
|
||||
- **Tinctures** - Metals (or, argent) and colors (gules, azure, etc.)
|
||||
|
||||
**COA Object:**
|
||||
```javascript
|
||||
{
|
||||
shield: "heater",
|
||||
division: "perPale",
|
||||
charges: ["lion", "eagle"],
|
||||
t1: "gules", // Tincture 1 (field)
|
||||
t2: "or" // Tincture 2 (charges)
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### markers-generator.js
|
||||
|
||||
**Purpose:** Places special markers and points of interest.
|
||||
|
||||
**Main Functions:**
|
||||
|
||||
```javascript
|
||||
Markers.generate()
|
||||
// Generates all markers
|
||||
|
||||
Markers.add(marker)
|
||||
// Adds custom marker
|
||||
|
||||
Markers.remove(markerId)
|
||||
// Removes marker
|
||||
```
|
||||
|
||||
**Marker Types:**
|
||||
- Volcanoes (mountains)
|
||||
- Ruins (ancient sites)
|
||||
- Battlefields
|
||||
- Mines (resources)
|
||||
- Bridges (river crossings)
|
||||
- Monuments
|
||||
- Shrines
|
||||
- Castles/Fortresses
|
||||
|
||||
**Marker Object:**
|
||||
```javascript
|
||||
{
|
||||
i: 1,
|
||||
type: "volcano",
|
||||
x: 150,
|
||||
y: 200,
|
||||
cell: 1234,
|
||||
icon: "🌋",
|
||||
size: 2,
|
||||
note: "Mount Doom" // Optional note
|
||||
}
|
||||
```
|
||||
|
||||
**Location in Pipeline:** Step 16 (final generation)
|
||||
|
||||
---
|
||||
|
||||
### voronoi.js
|
||||
|
||||
**Purpose:** Wrapper for Voronoi diagram generation.
|
||||
|
||||
**Main Functions:**
|
||||
|
||||
```javascript
|
||||
const voronoi = new Voronoi(delaunay, points);
|
||||
// Creates Voronoi from Delaunay triangulation
|
||||
|
||||
voronoi.toGrid()
|
||||
// Converts to grid data structure
|
||||
```
|
||||
|
||||
**Dependencies:**
|
||||
- Delaunator library (Delaunay triangulation)
|
||||
|
||||
---
|
||||
|
||||
### fonts.js
|
||||
|
||||
**Purpose:** Manages custom fonts for labels.
|
||||
|
||||
**Main Functions:**
|
||||
|
||||
```javascript
|
||||
Fonts.load(fontName)
|
||||
// Loads font for use
|
||||
|
||||
Fonts.getAvailable()
|
||||
// Returns list of available fonts
|
||||
```
|
||||
|
||||
**Available Fonts:**
|
||||
Multiple font families for different map styles (serif, sans-serif, fantasy, etc.)
|
||||
|
||||
---
|
||||
|
||||
## Renderer Modules
|
||||
|
||||
### coa-renderer.js
|
||||
|
||||
**Purpose:** Renders coats of arms to SVG.
|
||||
|
||||
**Main Functions:**
|
||||
|
||||
```javascript
|
||||
COArenderer.renderCoat(coa, container)
|
||||
// Renders coat of arms to SVG element
|
||||
|
||||
COArenderer.shield(shape, size)
|
||||
// Draws shield shape
|
||||
|
||||
COArenderer.division(type, t1, t2)
|
||||
// Applies field division
|
||||
|
||||
COArenderer.charge(type, position, size, tincture)
|
||||
// Adds heraldic charge
|
||||
```
|
||||
|
||||
**Output:** SVG graphic of the coat of arms
|
||||
|
||||
---
|
||||
|
||||
### relief-icons.js
|
||||
|
||||
**Purpose:** Renders terrain icons (mountains, forests, etc.)
|
||||
|
||||
**Main Functions:**
|
||||
|
||||
```javascript
|
||||
ReliefIcons.draw()
|
||||
// Draws all relief icons
|
||||
|
||||
ReliefIcons.add(type, cell)
|
||||
// Adds icon at cell
|
||||
```
|
||||
|
||||
**Icon Types:**
|
||||
- Mountains (peaks)
|
||||
- Hills
|
||||
- Forests
|
||||
- Swamps/wetlands
|
||||
- Volcanoes
|
||||
- Oases
|
||||
|
||||
---
|
||||
|
||||
### ocean-layers.js
|
||||
|
||||
**Purpose:** Renders ocean visualization layers.
|
||||
|
||||
**Main Functions:**
|
||||
|
||||
```javascript
|
||||
OceanLayers.draw()
|
||||
// Draws ocean effects
|
||||
|
||||
OceanLayers.toggle(layerName)
|
||||
// Shows/hides ocean layer
|
||||
```
|
||||
|
||||
**Layers:**
|
||||
- Waves
|
||||
- Bathymetry (depth)
|
||||
- Ocean currents
|
||||
|
||||
---
|
||||
|
||||
## I/O Modules (modules/io/)
|
||||
|
||||
### Save/Load
|
||||
|
||||
**Functions:**
|
||||
|
||||
```javascript
|
||||
// Save map
|
||||
downloadMap()
|
||||
// Downloads .map file
|
||||
|
||||
// Load map
|
||||
uploadMap(file)
|
||||
// Loads from .map file
|
||||
|
||||
loadMapFromURL(url)
|
||||
// Loads from URL
|
||||
```
|
||||
|
||||
**Format:**
|
||||
- JSON with all map data
|
||||
- Compressed using LZ compression
|
||||
- Extension: `.map`
|
||||
|
||||
### Export
|
||||
|
||||
**Functions:**
|
||||
|
||||
```javascript
|
||||
exportSVG()
|
||||
// Exports as SVG vector image
|
||||
|
||||
exportPNG()
|
||||
// Exports as PNG raster image
|
||||
|
||||
exportJSON()
|
||||
// Exports raw data as JSON
|
||||
```
|
||||
|
||||
**Export Formats:**
|
||||
- SVG (vector)
|
||||
- PNG (raster)
|
||||
- JSON (data)
|
||||
|
||||
---
|
||||
|
||||
## UI Modules (modules/ui/)
|
||||
|
||||
41+ specialized editors, each in its own file:
|
||||
|
||||
### Key Editors
|
||||
|
||||
**heightmap-editor.js** - Edit terrain elevation
|
||||
**rivers-editor.js** - Modify rivers
|
||||
**biomes-editor.js** - Edit biome distribution
|
||||
**states-editor.js** - Manage states
|
||||
**burgs-editor.js** - Edit settlements
|
||||
**cultures-editor.js** - Modify cultures
|
||||
**religions-editor.js** - Edit religions
|
||||
**provinces-editor.js** - Manage provinces
|
||||
**routes-editor.js** - Edit routes
|
||||
**military-overview.js** - Military management
|
||||
**markers-editor.js** - Place markers
|
||||
**notes-editor.js** - Annotations
|
||||
**style-editor.js** - Visual styling
|
||||
**options-editor.js** - Generation options
|
||||
|
||||
Each editor provides:
|
||||
- Dialog interface
|
||||
- Data manipulation
|
||||
- Real-time preview
|
||||
- Validation
|
||||
|
||||
---
|
||||
|
||||
## Dynamic Modules (modules/dynamic/)
|
||||
|
||||
Loaded on-demand for specific features:
|
||||
|
||||
- 3D view components
|
||||
- Advanced export options
|
||||
- Specialized tools
|
||||
|
||||
---
|
||||
|
||||
## Module Communication
|
||||
|
||||
### Global State
|
||||
|
||||
Modules communicate through global objects:
|
||||
```javascript
|
||||
grid // Terrain data
|
||||
pack // Civilization data
|
||||
seed // Random seed
|
||||
options // Settings
|
||||
```
|
||||
|
||||
### Events
|
||||
|
||||
Some modules use custom events:
|
||||
```javascript
|
||||
// Trigger event
|
||||
document.dispatchEvent(new CustomEvent('mapUpdated'));
|
||||
|
||||
// Listen for event
|
||||
document.addEventListener('mapUpdated', handleUpdate);
|
||||
```
|
||||
|
||||
### Direct Calls
|
||||
|
||||
Most module communication is through direct function calls:
|
||||
```javascript
|
||||
Rivers.generate();
|
||||
Cultures.expand();
|
||||
BurgsAndStates.generate();
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Adding New Modules
|
||||
|
||||
### Template Structure
|
||||
|
||||
```javascript
|
||||
"use strict";
|
||||
|
||||
window.MyModule = (function() {
|
||||
// Private variables
|
||||
let privateData = {};
|
||||
|
||||
// Private functions
|
||||
function privateFunction() {
|
||||
// Implementation
|
||||
}
|
||||
|
||||
// Public functions
|
||||
function publicFunction() {
|
||||
// Implementation
|
||||
}
|
||||
|
||||
// Public API
|
||||
return {
|
||||
publicFunction
|
||||
};
|
||||
})();
|
||||
```
|
||||
|
||||
### Integration Steps
|
||||
|
||||
1. Create module file in `modules/`
|
||||
2. Include in `index.html`:
|
||||
```html
|
||||
<script src="modules/my-module.js"></script>
|
||||
```
|
||||
3. Call from main pipeline if needed
|
||||
4. Add UI editor if appropriate
|
||||
5. Update save/load if storing data
|
||||
|
||||
---
|
||||
|
||||
## Module Dependencies
|
||||
|
||||
### Core Dependencies
|
||||
|
||||
All modules depend on:
|
||||
- **main.js** - Global state and utilities
|
||||
- **grid/pack objects** - Data structures
|
||||
|
||||
### Common Library Dependencies
|
||||
|
||||
- **D3.js** - SVG manipulation
|
||||
- **jQuery** - DOM operations
|
||||
- **Delaunator** - Triangulation (for grid)
|
||||
|
||||
### Module Dependencies
|
||||
|
||||
```
|
||||
heightmap-generator.js
|
||||
↓
|
||||
river-generator.js
|
||||
↓
|
||||
biomes.js
|
||||
↓
|
||||
cultures-generator.js
|
||||
↓
|
||||
burgs-and-states.js
|
||||
↓
|
||||
religions-generator.js
|
||||
↓
|
||||
routes-generator.js
|
||||
```
|
||||
|
||||
Each module typically depends on previous stages being complete.
|
||||
|
||||
---
|
||||
|
||||
## Performance Notes
|
||||
|
||||
### Expensive Operations
|
||||
|
||||
- **River generation** - Flux calculation O(n log n)
|
||||
- **Culture expansion** - BFS over cells O(n)
|
||||
- **Pathfinding** - Dijkstra for routes O(E + V log V)
|
||||
|
||||
### Optimization Tips
|
||||
|
||||
- Use typed arrays
|
||||
- Minimize D3 updates
|
||||
- Cache calculations
|
||||
- Use spatial indexing
|
||||
|
||||
---
|
||||
|
||||
## Further Reading
|
||||
|
||||
- [Data Model](Data-Model.md) - Data structures
|
||||
- [Generation Process](Generation-Process.md) - Pipeline overview
|
||||
- [Architecture](Architecture.md) - System design
|
||||
144
wiki/README.md
Normal file
144
wiki/README.md
Normal file
|
|
@ -0,0 +1,144 @@
|
|||
# Fantasy Map Generator Wiki Documentation
|
||||
|
||||
This directory contains comprehensive documentation for the Fantasy Map Generator project.
|
||||
|
||||
## Documentation Overview
|
||||
|
||||
The wiki is organized into the following main sections:
|
||||
|
||||
### Core Documentation
|
||||
|
||||
1. **[Home](Home.md)** - Wiki homepage with overview and quick links
|
||||
2. **[Getting Started](Getting-Started.md)** - Beginner's guide for users and developers
|
||||
3. **[Architecture](Architecture.md)** - System architecture and design patterns
|
||||
4. **[Data Model](Data-Model.md)** - Complete data structures and relationships
|
||||
5. **[Generation Process](Generation-Process.md)** - Detailed map generation pipeline
|
||||
6. **[Modules Reference](Modules-Reference.md)** - Documentation for all modules
|
||||
7. **[Features and UI](Features-and-UI.md)** - Complete feature list and UI guide
|
||||
|
||||
## Quick Navigation
|
||||
|
||||
### For Users
|
||||
- New to the generator? Start with [Getting Started](Getting-Started.md)
|
||||
- Want to learn all features? See [Features and UI](Features-and-UI.md)
|
||||
- Need help with something? Check [Home](Home.md) for support links
|
||||
|
||||
### For Developers
|
||||
- Setting up development? See [Getting Started](Getting-Started.md#for-developers)
|
||||
- Understanding the architecture? Read [Architecture](Architecture.md)
|
||||
- Working with data? Check [Data Model](Data-Model.md)
|
||||
- Adding features? Review [Modules Reference](Modules-Reference.md)
|
||||
- Understanding generation? See [Generation Process](Generation-Process.md)
|
||||
|
||||
## What's Documented
|
||||
|
||||
### Architecture Documentation
|
||||
- System design and components
|
||||
- Module organization and patterns
|
||||
- Technology stack
|
||||
- Performance considerations
|
||||
- SVG layer structure
|
||||
- Data flow architecture
|
||||
|
||||
### Data Model Documentation
|
||||
- Grid and Pack data structures
|
||||
- Cell properties and relationships
|
||||
- Civilization hierarchies
|
||||
- Biome data
|
||||
- Data access patterns
|
||||
- Serialization format
|
||||
- Performance considerations
|
||||
|
||||
### Generation Process Documentation
|
||||
- Complete 17-stage generation pipeline
|
||||
- Detailed explanations of each stage
|
||||
- Algorithms and techniques
|
||||
- Climate simulation
|
||||
- Water feature generation
|
||||
- Civilization creation
|
||||
- Procedural name generation
|
||||
|
||||
### Modules Reference
|
||||
- All core generator modules
|
||||
- Civilization generators
|
||||
- Utility modules
|
||||
- Renderers
|
||||
- I/O modules
|
||||
- UI editors (41+)
|
||||
- Module APIs and usage
|
||||
|
||||
### Features Documentation
|
||||
- All user-facing features
|
||||
- Complete UI guide
|
||||
- Editing capabilities
|
||||
- Export and save options
|
||||
- Advanced features
|
||||
- Keyboard shortcuts
|
||||
- Tips and troubleshooting
|
||||
|
||||
## Documentation Structure
|
||||
|
||||
```
|
||||
wiki/
|
||||
├── README.md # This file
|
||||
├── Home.md # Wiki homepage
|
||||
├── Getting-Started.md # Beginner's guide
|
||||
├── Architecture.md # System architecture
|
||||
├── Data-Model.md # Data structures
|
||||
├── Generation-Process.md # Generation pipeline
|
||||
├── Modules-Reference.md # Module documentation
|
||||
└── Features-and-UI.md # Features and UI guide
|
||||
```
|
||||
|
||||
## Contributing to Documentation
|
||||
|
||||
Found an error or want to improve the docs?
|
||||
|
||||
1. Documentation is stored in the `wiki/` directory
|
||||
2. All files are in Markdown format
|
||||
3. Submit pull requests with improvements
|
||||
4. Follow the existing structure and style
|
||||
|
||||
### Documentation Guidelines
|
||||
|
||||
- **Be clear and concise** - Help readers understand quickly
|
||||
- **Use examples** - Show code snippets and usage
|
||||
- **Add diagrams** - Visual aids help comprehension
|
||||
- **Link related topics** - Help readers navigate
|
||||
- **Keep it updated** - Update docs when code changes
|
||||
|
||||
## Additional Resources
|
||||
|
||||
### Official Links
|
||||
- **Live Application**: [azgaar.github.io/Fantasy-Map-Generator](https://azgaar.github.io/Fantasy-Map-Generator)
|
||||
- **GitHub Repository**: [github.com/Azgaar/Fantasy-Map-Generator](https://github.com/Azgaar/Fantasy-Map-Generator)
|
||||
- **Discord Community**: [discord.com/invite/X7E84HU](https://discordapp.com/invite/X7E84HU)
|
||||
- **Reddit Community**: [reddit.com/r/FantasyMapGenerator](https://www.reddit.com/r/FantasyMapGenerator)
|
||||
|
||||
### External Documentation
|
||||
- [Official Wiki](https://github.com/Azgaar/Fantasy-Map-Generator/wiki) - Additional guides
|
||||
- [Azgaar's Blog](https://azgaar.wordpress.com) - Development blog
|
||||
- [Trello Board](https://trello.com/b/7x832DG4/fantasy-map-generator) - Development roadmap
|
||||
|
||||
## Version Information
|
||||
|
||||
This documentation is current as of:
|
||||
- **Generator Version**: Latest (continuously updated)
|
||||
- **Documentation Date**: November 2025
|
||||
- **Status**: Comprehensive initial version
|
||||
|
||||
## Feedback
|
||||
|
||||
Have suggestions for improving this documentation?
|
||||
|
||||
- Open an issue on [GitHub](https://github.com/Azgaar/Fantasy-Map-Generator/issues)
|
||||
- Discuss on [Discord](https://discordapp.com/invite/X7E84HU)
|
||||
- Submit a pull request with improvements
|
||||
|
||||
## License
|
||||
|
||||
This documentation is part of the Fantasy Map Generator project and is licensed under the MIT License.
|
||||
|
||||
---
|
||||
|
||||
**Happy mapping!** 🗺️
|
||||
Loading…
Add table
Add a link
Reference in a new issue