From fa9ec736edd4fdbe8455c706eccda6dc8ab8f30f Mon Sep 17 00:00:00 2001 From: Azgaar Date: Fri, 30 Mar 2018 01:00:54 +0300 Subject: [PATCH] v. 055b WIP version is removed, Demo version is updated --- Demo version/README.md | 17 - Demo version/font/fontello.css | 148 - Demo version/font/fontello.eot | Bin 34836 -> 0 bytes Demo version/font/fontello.svg | 216 - Demo version/font/fontello.ttf | Bin 34668 -> 0 bytes Demo version/font/fontello.woff | Bin 19324 -> 0 bytes Demo version/font/fontello.woff2 | Bin 16268 -> 0 bytes Demo version/index.css | Bin 21964 -> 0 bytes Demo version/script.js | 3821 ---------------- LICENSE | 674 --- README.md | 18 +- WIP version/index.css | 349 -- WIP version/index.html | 238 - WIP version/script.js | 2639 ----------- WIP version/vec2.js | 64 - Demo version/fonts.css => fonts.css | 0 icons.css | 210 + images/Facebook.png | Bin 0 -> 318 bytes images/Pinterest.png | Bin 0 -> 443 bytes images/Reddit.png | Bin 0 -> 509 bytes images/Tumblr.png | Bin 0 -> 310 bytes images/Twitter.png | Bin 0 -> 379 bytes images/favicon-16x16.png | Bin 0 -> 740 bytes images/favicon-32x32.png | Bin 0 -> 2243 bytes images/preview.png | Bin 0 -> 90267 bytes index.css | Bin 0 -> 102040 bytes Demo version/index.html => index.html | 490 +- index.md | 3 - libs/d3-hexbin.v0.2.min.js | 2 + libs/d3-scale-chromatic.v1.min.js | 2 + libs/d3.v4.min.js | 2 + libs/jquery-3.1.1.min.js | 4 + libs/jquery-ui.min.js | 13 + libs/polylabel.js | 232 + libs/priority-queue.js | 387 ++ {Demo version => libs}/quantize.js | 0 Demo version/names.js => names.js | 0 script.js | 5949 +++++++++++++++++++++++++ 38 files changed, 7193 insertions(+), 8285 deletions(-) delete mode 100644 Demo version/README.md delete mode 100644 Demo version/font/fontello.css delete mode 100644 Demo version/font/fontello.eot delete mode 100644 Demo version/font/fontello.svg delete mode 100644 Demo version/font/fontello.ttf delete mode 100644 Demo version/font/fontello.woff delete mode 100644 Demo version/font/fontello.woff2 delete mode 100644 Demo version/index.css delete mode 100644 Demo version/script.js delete mode 100644 LICENSE delete mode 100644 WIP version/index.css delete mode 100644 WIP version/index.html delete mode 100644 WIP version/script.js delete mode 100644 WIP version/vec2.js rename Demo version/fonts.css => fonts.css (100%) create mode 100644 icons.css create mode 100644 images/Facebook.png create mode 100644 images/Pinterest.png create mode 100644 images/Reddit.png create mode 100644 images/Tumblr.png create mode 100644 images/Twitter.png create mode 100644 images/favicon-16x16.png create mode 100644 images/favicon-32x32.png create mode 100644 images/preview.png create mode 100644 index.css rename Demo version/index.html => index.html (53%) delete mode 100644 index.md create mode 100644 libs/d3-hexbin.v0.2.min.js create mode 100644 libs/d3-scale-chromatic.v1.min.js create mode 100644 libs/d3.v4.min.js create mode 100644 libs/jquery-3.1.1.min.js create mode 100644 libs/jquery-ui.min.js create mode 100644 libs/polylabel.js create mode 100644 libs/priority-queue.js rename {Demo version => libs}/quantize.js (100%) rename Demo version/names.js => names.js (100%) create mode 100644 script.js diff --git a/Demo version/README.md b/Demo version/README.md deleted file mode 100644 index 2816cbfd..00000000 --- a/Demo version/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Fantasy Map Generator - -Azgaar's _Fantasy Map Generator_. Based on [D3](https://d3js.org) Voronoi diagram rendered in svg. Please open a [raw version](http://bl.ocks.org/Azgaar/raw/b845ce22ea68090d43a4ecfb914f51bd) to be able to enlarge the map and pring it. - -Project goal is a procedurally generated map for my *Medieval Dynasty* simulator. Map should be interactive, scalable, fast and plausible. There should be enought space to place at least 500 burgs within 7 countries. The imagined land area is about 1 million km2. - -Please refer to [the project wiki](https://github.com/Azgaar/Fantasy-Map-Generator/wiki) for guidance. Links to an older versions are listed in the [changelog](https://github.com/Azgaar/Fantasy-Map-Generator/wiki/Changelog). - -This is a demo version, some new cool features are developed, but not yet deployed. Some details are covered in my blog [_Fantasy Maps for fun and glory_](https://azgaar.wordpress.com), you may also keep an eye on my [devboard](https://trello.com/b/7x832DG4/fantasy-map-generator). Comments and ideas are *highly* welcomed, kindly contact me via [email](mailto:maxganiev@yandex.ru). I would also like to see your completed or work in progress maps. For bug reports and change requests please use the main project [issues page](https://github.com/Azgaar/Fantasy-Map-Generator/issues). - -_Inspiration:_ - -* 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) diff --git a/Demo version/font/fontello.css b/Demo version/font/fontello.css deleted file mode 100644 index cb295101..00000000 --- a/Demo version/font/fontello.css +++ /dev/null @@ -1,148 +0,0 @@ -@font-face { - font-family: 'fontello'; - src: url('../font/fontello.eot?69634679'); - src: url('../font/fontello.eot?69634679#iefix') format('embedded-opentype'), - url('../font/fontello.woff2?69634679') format('woff2'), - url('../font/fontello.woff?69634679') format('woff'), - url('../font/fontello.ttf?69634679') format('truetype'), - url('../font/fontello.svg?69634679#fontello') format('svg'); - font-weight: normal; - font-style: normal; -} -/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ -/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ -/* -@media screen and (-webkit-min-device-pixel-ratio:0) { - @font-face { - font-family: 'fontello'; - src: url('../font/fontello.svg?69634679#fontello') format('svg'); - } -} -*/ - - [class^="icon-"]:before, [class*=" icon-"]:before { - font-family: "fontello"; - font-style: normal; - font-weight: normal; - speak: none; - - display: inline-block; - text-decoration: inherit; - width: 1em; - text-align: center; - font-size: 1em; - margin: -1px; - padding: 0; - - /* For safety - reset parent styles, that can break glyph codes*/ - font-variant: normal; - text-transform: none; - line-height: 1em; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ -} - -.icon-pencil:before { content: '\e800'; } /* '' */ -.icon-font:before { content: '\e801'; } /* '' */ -.icon-arrows-cw:before { content: '\e802'; } /* '' */ -.icon-doc:before { content: '\e803'; } /* '' */ -.icon-trash-empty:before { content: '\e804'; } /* '' */ -.icon-ok:before { content: '\e805'; } /* '' */ -.icon-ok-circled:before { content: '\e806'; } /* '' */ -.icon-ok-circled2:before { content: '\e807'; } /* '' */ -.icon-link:before { content: '\e808'; } /* '' */ -.icon-globe:before { content: '\e809'; } /* '' */ -.icon-plus:before { content: '\e80a'; } /* '' */ -.icon-plus-circled:before { content: '\e80b'; } /* '' */ -.icon-minus-circled:before { content: '\e80c'; } /* '' */ -.icon-minus:before { content: '\e80d'; } /* '' */ -.icon-text-height:before { content: '\e80e'; } /* '' */ -.icon-adjust:before { content: '\e80f'; } /* '' */ -.icon-tag:before { content: '\e810'; } /* '' */ -.icon-tags:before { content: '\e811'; } /* '' */ -.icon-logout:before { content: '\e812'; } /* '' */ -.icon-download:before { content: '\e813'; } /* '' */ -.icon-down-circled2:before { content: '\e814'; } /* '' */ -.icon-upload:before { content: '\e815'; } /* '' */ -.icon-up-circled2:before { content: '\e816'; } /* '' */ -.icon-cancel-circled2:before { content: '\e817'; } /* '' */ -.icon-cancel-circled:before { content: '\e818'; } /* '' */ -.icon-cancel:before { content: '\e819'; } /* '' */ -.icon-check:before { content: '\e81a'; } /* '' */ -.icon-align-left:before { content: '\e81b'; } /* '' */ -.icon-align-center:before { content: '\e81c'; } /* '' */ -.icon-align-right:before { content: '\e81d'; } /* '' */ -.icon-align-justify:before { content: '\e81e'; } /* '' */ -.icon-star:before { content: '\e81f'; } /* '' */ -.icon-star-empty:before { content: '\e820'; } /* '' */ -.icon-search:before { content: '\e821'; } /* '' */ -.icon-mail:before { content: '\e822'; } /* '' */ -.icon-eye:before { content: '\e823'; } /* '' */ -.icon-eye-off:before { content: '\e824'; } /* '' */ -.icon-pin:before { content: '\e825'; } /* '' */ -.icon-lock-open:before { content: '\e826'; } /* '' */ -.icon-lock:before { content: '\e827'; } /* '' */ -.icon-attach:before { content: '\e828'; } /* '' */ -.icon-home:before { content: '\e829'; } /* '' */ -.icon-info-circled:before { content: '\e82a'; } /* '' */ -.icon-help-circled:before { content: '\e82b'; } /* '' */ -.icon-shuffle:before { content: '\e82c'; } /* '' */ -.icon-ccw:before { content: '\e82d'; } /* '' */ -.icon-cw:before { content: '\e82e'; } /* '' */ -.icon-play:before { content: '\e82f'; } /* '' */ -.icon-play-circled2:before { content: '\e830'; } /* '' */ -.icon-down-big:before { content: '\e831'; } /* '' */ -.icon-left-big:before { content: '\e832'; } /* '' */ -.icon-right-big:before { content: '\e833'; } /* '' */ -.icon-up-big:before { content: '\e834'; } /* '' */ -.icon-up-open:before { content: '\e835'; } /* '' */ -.icon-right-open:before { content: '\e836'; } /* '' */ -.icon-left-open:before { content: '\e837'; } /* '' */ -.icon-down-open:before { content: '\e838'; } /* '' */ -.icon-cloud:before { content: '\e839'; } /* '' */ -.icon-text-width:before { content: '\e83a'; } /* '' */ -.icon-italic:before { content: '\e83b'; } /* '' */ -.icon-bold:before { content: '\e83c'; } /* '' */ -.icon-move:before { content: '\f047'; } /* '' */ -.icon-link-ext:before { content: '\f08e'; } /* '' */ -.icon-check-empty:before { content: '\f096'; } /* '' */ -.icon-docs:before { content: '\f0c5'; } /* '' */ -.icon-list-bullet:before { content: '\f0ca'; } /* '' */ -.icon-mail-alt:before { content: '\f0e0'; } /* '' */ -.icon-sitemap:before { content: '\f0e8'; } /* '' */ -.icon-exchange:before { content: '\f0ec'; } /* '' */ -.icon-download-cloud:before { content: '\f0ed'; } /* '' */ -.icon-upload-cloud:before { content: '\f0ee'; } /* '' */ -.icon-plus-squared:before { content: '\f0fe'; } /* '' */ -.icon-unlink:before { content: '\f127'; } /* '' */ -.icon-help:before { content: '\f128'; } /* '' */ -.icon-info:before { content: '\f129'; } /* '' */ -.icon-eraser:before { content: '\f12d'; } /* '' */ -.icon-rocket:before { content: '\f135'; } /* '' */ -.icon-lock-open-alt:before { content: '\f13e'; } /* '' */ -.icon-play-circled:before { content: '\f144'; } /* '' */ -.icon-minus-squared:before { content: '\f146'; } /* '' */ -.icon-minus-squared-alt:before { content: '\f147'; } /* '' */ -.icon-level-up:before { content: '\f148'; } /* '' */ -.icon-level-down:before { content: '\f149'; } /* '' */ -.icon-ok-squared:before { content: '\f14a'; } /* '' */ -.icon-expand:before { content: '\f150'; } /* '' */ -.icon-collapse:before { content: '\f151'; } /* '' */ -.icon-expand-right:before { content: '\f152'; } /* '' */ -.icon-sort-alt-up:before { content: '\f160'; } /* '' */ -.icon-sort-alt-down:before { content: '\f161'; } /* '' */ -.icon-right-circled2:before { content: '\f18e'; } /* '' */ -.icon-left-circled2:before { content: '\f190'; } /* '' */ -.icon-collapse-left:before { content: '\f191'; } /* '' */ -.icon-plus-squared-alt:before { content: '\f196'; } /* '' */ -.icon-history:before { content: '\f1da'; } /* '' */ -.icon-header:before { content: '\f1dc'; } /* '' */ -.icon-trash:before { content: '\f1f8'; } /* '' */ -.icon-brush:before { content: '\f1fc'; } /* '' */ -.icon-clone:before { content: '\f24d'; } /* '' */ -.icon-hourglass-1:before { content: '\f251'; } /* '' */ -.icon-hand-grab-o:before { content: '\f255'; } /* '' */ -.icon-hand-paper-o:before { content: '\f256'; } /* '' */ -.icon-calendar-check-o:before { content: '\f274'; } /* '' */ -.icon-map-pin:before { content: '\f276'; } /* '' */ \ No newline at end of file diff --git a/Demo version/font/fontello.eot b/Demo version/font/fontello.eot deleted file mode 100644 index 11f05e9a056844bc633526511370525a29ae6db3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34836 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 diff --git a/Demo version/font/fontello.svg b/Demo version/font/fontello.svg deleted file mode 100644 index d6e5debd..00000000 --- a/Demo version/font/fontello.svg +++ /dev/null @@ -1,216 +0,0 @@ - - - -Copyright (C) 2018 by original authors @ fontello.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Demo version/font/fontello.ttf b/Demo version/font/fontello.ttf deleted file mode 100644 index 6399f4aa73e4d8ede5f7f292158811143b8cf90a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34668 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�p}j>Zz9R9PzwWY=TxR_7U6GAa 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

>b8@e7CRO@gKd@MXo7C-I>O7jZ2+vzN62rh_6%b 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 FI{;k@bdmr7 diff --git a/Demo version/script.js b/Demo version/script.js deleted file mode 100644 index ab520e17..00000000 --- a/Demo version/script.js +++ /dev/null @@ -1,3821 +0,0 @@ -// Fantasy Map Generator main script -"use strict;" -fantasyMap(); -function fantasyMap() { - // Declare variables - var svg = d3.select("svg"), - mapWidth = +svg.attr("width"), - mapHeight = +svg.attr("height"), - defs = svg.select("#deftemp"), - viewbox = svg.append("g").attr("id", "viewbox").on("touchmove mousemove", moved).on("click", clicked), - ocean = viewbox.append("g").attr("id", "ocean"), - oceanLayers = ocean.append("g").attr("id", "oceanLayers"), - oceanPattern = ocean.append("g").attr("id", "oceanPattern"), - landmass = viewbox.append("g").attr("id", "landmass"), - terrs = viewbox.append("g").attr("id", "terrs"), - cults = viewbox.append("g").attr("id", "cults"), - routes = viewbox.append("g").attr("id", "routes"), - roads = routes.append("g").attr("id", "roads"), - trails = routes.append("g").attr("id", "trails"), - rivers = viewbox.append("g").attr("id", "rivers"), - terrain = viewbox.append("g").attr("id", "terrain"), - regions = viewbox.append("g").attr("id", "regions"), - borders = viewbox.append("g").attr("id", "borders"), - stateBorders = borders.append("g").attr("id", "stateBorders"), - neutralBorders = borders.append("g").attr("id", "neutralBorders"), - coastline = viewbox.append("g").attr("id", "coastline"), - lakes = viewbox.append("g").attr("id", "lakes"), - grid = viewbox.append("g").attr("id", "grid"), - searoutes = routes.append("g").attr("id", "searoutes"), - labels = viewbox.append("g").attr("id", "labels"), - icons = viewbox.append("g").attr("id", "icons"), - burgs = icons.append("g").attr("id", "burgs"), - debug = viewbox.append("g").attr("id", "debug"); - - // Declare styles - landmass.attr("fill", "#eef6fb"); - coastline.attr("opacity", .5).attr("stroke", "#1f3846").attr("stroke-width", .7).attr("filter", "url(#blurFilter)"); - regions.attr("opacity", .55); - stateBorders.attr("opacity", .8).attr("stroke", "#56566d").attr("stroke-width", .5).attr("stroke-dasharray", "1.2 1.5").attr("stroke-linecap", "butt"); - neutralBorders.attr("opacity", .8).attr("stroke", "#56566d").attr("stroke-width", .3).attr("stroke-dasharray", "1 1.5").attr("stroke-linecap", "butt"); - cults.attr("opacity", .6); - rivers.attr("fill", "#5d97bb"); - lakes.attr("fill", "#a6c1fd").attr("stroke", "#477794").attr("stroke-width", .3); - burgs.attr("fill", "#ffffff").attr("stroke", "#3e3e4b"); - roads.attr("opacity", .8).attr("stroke", "#d06324").attr("stroke-width", .4).attr("stroke-dasharray", "1 2").attr("stroke-linecap", "round"); - trails.attr("opacity", .8).attr("stroke", "#d06324").attr("stroke-width", .1).attr("stroke-dasharray", ".5 1").attr("stroke-linecap", "round"); - searoutes.attr("opacity", .8).attr("stroke", "#ffffff").attr("stroke-width", .2).attr("stroke-dasharray", "1 2").attr("stroke-linecap", "round"); - grid.attr("stroke", "#808080").attr("stroke-width", .1); - - // canvas - var canvas = document.getElementById("canvas"), - ctx = canvas.getContext("2d"); - - // Color schemes - var color = d3.scaleSequential(d3.interpolateSpectral), - colors8 = d3.scaleOrdinal(d3.schemeSet2), - colors20 = d3.scaleOrdinal(d3.schemeCategory20); - - // Version control - var version = "0.52b"; - document.title = document.title + " v. " + version; - - // Common variables - var customization, elSelected, cells = [], land = [], riversData = [], manors = [], - queue = [], chain = {}, island = 0, cultureTree, manorTree; - var graphSize = +sizeInput.value, - manorsCount = manorsInput.value, - capitalsCount = regionsInput.value, - power = powerInput.value, - neutral = neutralInput.value, - swampiness = swampinessInput.value, - sharpness = sharpnessInput.value; - if (neutral === "100") {neutral = "300";} - - // Groups for labels - var fonts = ["Amatic+SC:700"], - capitals = labels.append("g").attr("id", "capitals").attr("fill", "#3e3e4b").attr("opacity", 1).attr("font-family", "Amatic SC").attr("data-font", "Amatic+SC:700").attr("font-size", Math.round(6 - capitalsCount / 20)), - towns = labels.append("g").attr("id", "towns").attr("fill", "#3e3e4b").attr("opacity", 1).attr("font-family", "Amatic SC").attr("data-font", "Amatic+SC:700").attr("font-size", 2), - countries = labels.append("g").attr("id", "countries").attr("fill", "#3e3e4b").attr("opacity", 1).attr("font-family", "Amatic SC").attr("data-font", "Amatic+SC:700").attr("font-size", Math.round(18 - capitalsCount / 6)); - - // append ocean pattern - oceanPattern.append("rect").attr("x", 0).attr("y", 0) - .attr("width", mapWidth).attr("height", mapHeight).attr("class", "pattern") - .attr("stroke", "none").attr("fill", "url(#oceanPattern)"); - oceanLayers.append("rect").attr("x", 0).attr("y", 0) - .attr("width", mapWidth).attr("height", mapHeight).attr("id", "oceanBase").attr("fill", "#5167a9"); - - // D3 Line generator - var scX = d3.scaleLinear().domain([0, mapWidth]).range([0, mapWidth]), - scY = d3.scaleLinear().domain([0, mapHeight]).range([0, mapHeight]), - lineGen = d3.line().x(function(d) {return scX(d.scX);}).y(function(d) {return scY(d.scY);}); - - // main data variables - var voronoi = d3.voronoi().extent([[0, 0], [mapWidth, mapHeight]]); - var diagram, polygons, points = [], sample; - - // D3 drag and zoom behavior - var scale = 1, viewX = 0, viewY = 0; - var zoom = d3.zoom().scaleExtent([1, 40]) // 40x is default max zoom - .translateExtent([[0, 0], [mapWidth, mapHeight]]) // 0,0 as default extent - .on("zoom", zoomed); - svg.call(zoom); - - $("#optionsContainer").draggable({handle: ".drag-trigger", snap: "svg", snapMode: "both"}); - $("#mapLayers").sortable({items: "li:not(.solid)", cancel: ".solid", update: moveLayer}); - $("#templateBody").sortable({items: "div:not(div[data-type='Mountain'])"}); - $("#mapLayers, #templateBody").disableSelection(); - - var drag = d3.drag() - .container(function() {return this;}) - .subject(function() {var p=[d3.event.x, d3.event.y]; return [p, p];}) - .on("start", dragstarted); - - function zoomed() { - scale = d3.event.transform.k; - viewX = d3.event.transform.x; - viewY = d3.event.transform.y; - viewbox.attr("transform", d3.event.transform); - } - - // Manually update viewbox - function zoomUpdate() { - var transform = d3.zoomIdentity.translate(viewX, viewY).scale(scale); - svg.call(zoom.transform, transform); - } - - generate(); // genarate map on load - - function generate() { - console.group("Random map"); - console.time("TOTAL"); - placePoints(); - calculateVoronoi(points); - detectNeighbors(); - defineHeightmap(); - markFeatures(); - drawOcean(); - reGraph(); - resolveDepressions(); - flux(); - drawRelief(); - drawCoastline(); - manorsAndRegions(); - console.timeEnd("TOTAL"); - console.groupEnd("Random map"); - } - - // Locate points to calculate Voronoi diagram - function placePoints() { - console.time("placePoints"); - points = []; - var radius = 5.9 / graphSize; // 5.9 is a radius to get 8k cells - var sampler = poissonDiscSampler(mapWidth, mapHeight, radius); - while (sample = sampler()) {points.push([Math.ceil(sample[0]), Math.ceil(sample[1])]);} - console.timeEnd("placePoints"); - } - - // Calculate Voronoi Diagram - function calculateVoronoi(points) { - console.time("calculateVoronoi"); - diagram = voronoi(points), - polygons = diagram.polygons(); - console.log(" cells: " + points.length); - console.timeEnd("calculateVoronoi"); - } - - // Get cell info on mouse move (useful for debugging) - function moved() { - var point = d3.mouse(this); - var i = diagram.find(point[0], point[1]).index; - if (i) { - var p = cells[i]; // get cell - $("#lx").text(Math.ceil(point[0])); - $("#ly").text(Math.ceil(point[1])); - $("#cell").text(i); - $("#height").text(ifDefined(p.height, 2)); - $("#flux").text(ifDefined(p.flux, 3)); - $("#river").text(ifDefined(p.river)); - $("#region").text(ifDefined(p.region)); - $("#feature").text(ifDefined(p.feature) + "" + ifDefined(p.featureNumber)); - $("#score").text(ifDefined(p.score)); - $("#path").text(ifDefined(p.path)); - $("#culture").text(ifDefined(cultures[p.culture])); - d3.select("body").on("keydown", function() { - if (d3.event.keyCode == 32) {console.table(p);} - if (d3.event.keyCode == 77) {console.table(manors);} - if (d3.event.keyCode == 67) {console.log(cells);} - }); - } - // draw line for Customization range placing - icons.selectAll(".line").remove(); - if (customization === 1 && icons.selectAll(".tag").size() === 1) { - var x = +icons.select(".tag").attr("cx"); - var y = +icons.select(".tag").attr("cy"); - icons.insert("line", ":first-child").attr("class", "line").attr("x1", x).attr("y1", y).attr("x2", point[0]).attr("y2", point[1]); - } - } - - // return value (e) if defined with specified number of decimals (f) - function ifDefined(e, f) { - if (e == undefined) {return "no";} - if (f) {return e.toFixed(f);} - return e; - } - - // Drag actions - function dragstarted() { - var x0 = d3.event.x, - y0 = d3.event.y, - c0 = diagram.find(x0, y0).index, - c1 = c0; - d3.event.on("drag", function() { - if (customization === 1) { - var x1 = d3.event.x, - y1 = d3.event.y, - c2 = diagram.find(x1, y1).index; - if (c2 !== c1) { - c1 = c2; - var brush = $("#options .pressed").attr("id"); - var power = +brushPower.value; - if (brush === "brushElevate") { - if (cells[c2].height < 0.2) {cells[c2].height = 0.2} else {cells[c2].height += power;} - } - if (brush === "brushDepress") {cells[c2].height -= power;} - if (brush === "brushHill") {add(c2, "hill", power);} - if (brush === "brushPit") {addPit(1, power, c2);} - if (brush === "brushAlign") {cells[c2].height = cells[c0].height;} - if (brush === "brushSmooth") { - var heights = [cells[c2].height]; - cells[c2].neighbors.forEach(function(e) {heights.push(cells[e].height);}); - cells[c2].height = d3.mean(heights); - } - } - mockHeightmap(); - } else { - viewbox.on(".drag", null); - } - }); - } - - - // turn D3 polygons array into cell array, define neighbors for each cell - function detectNeighbors(withGrid) { - console.time("detectNeighbors"); - var gridPath = ""; // store grid as huge single path string - polygons.map(function(i, d) { - var neighbors = []; - var type; // define type, -99 for map borders - if (withGrid) {gridPath += "M" + i.join("L") + "Z";} // grid path - diagram.cells[d].halfedges.forEach(function(e) { - var edge = diagram.edges[e], ea; - if (edge.left && edge.right) { - ea = edge.left.index; - if (ea === d) {ea = edge.right.index;} - neighbors.push(ea); - } else { - if (edge.left) {ea = edge.left.index;} else {ea = edge.right.index;} - type = -99; // polygon is on border if it has edge without opposite side polygon - } - }) - cells.push({index: d, data: i.data, height: 0, type, neighbors}); - }); - if (withGrid) {grid.append("path").attr("d", round(gridPath));} - console.timeEnd("detectNeighbors"); - } - - // Generate Heigtmap routine - function defineHeightmap() { - console.time('defineHeightmap'); - var mapTemplate = templateInput.value; - if (mapTemplate === "Random") { - var rnd = Math.random(); - if (rnd > 0.98) {mapTemplate = "Volcano";} - if (rnd > 0.8 && rnd <= 0.98) {mapTemplate = "High Island";} - if (rnd > 0.62 && rnd <= 0.8) {mapTemplate = "Low Island";} - if (rnd > 0.35 && rnd <= 0.62) {mapTemplate = "Continents";} - if (rnd > 0.01 && rnd <= 0.35) {mapTemplate = "Archipelago";} - if (rnd <= 0.01) {mapTemplate = "Atoll";} - } - addMountain(); - if (mapTemplate === "Volcano") {templateVolcano();} - if (mapTemplate === "High Island") {templateHighIsland();} - if (mapTemplate === "Low Island") {templateLowIsland();} - if (mapTemplate === "Continents") {templateContinents();} - if (mapTemplate === "Archipelago") {templateArchipelago();} - if (mapTemplate === "Atoll") {templateAtoll();} - console.log(mapTemplate + " template is applied"); - console.timeEnd('defineHeightmap'); - } - - // Heighmap Template: Volcano - function templateVolcano() { - modifyHeights("all", 0.07, 1.1); - addHill(5, 0.4); - addHill(2, 0.15); - } - -// Heighmap Template: High Island - function templateHighIsland() { - modifyHeights("all", 0.08, 0.9); - addRange(4); - addHill(12, 0.25); - addRange(-3); - modifyHeights("land", 0, 0.75); - addHill(3, 0.15); - } - -// Heighmap Template: Low Island - function templateLowIsland() { - modifyHeights("all", 0.05, 1); - smoothHeights(); - addHill(4, 0.4); - addHill(12, 0.2); - addRange(-3); - modifyHeights("land", 0, 0.3); - } - - // Heighmap Template: Continents - function templateContinents() { - addHill(24, 0.25); - addRange(2); - addHill(3, 0.1); - modifyHeights("land", 0, 0.7); - var count = Math.floor(Math.random() * 7 + 2); - addStrait(count); - smoothHeights(); - addPit(5); - addRange(-3); - modifyHeights("land", 0, 0.8); - modifyHeights("all", 0.02, 1); - } - - // Heighmap Template: Archipelago - function templateArchipelago() { - modifyHeights("land", -0.2, 1); - addHill(15, 0.15); - addRange(-2); - addPit(8); - modifyHeights("land", -0.05, 0.9); - } - - // Heighmap Template: Atoll - function templateAtoll() { - addHill(2, 0.35); - addRange(1); - modifyHeights("all", 0.07, 1); - smoothHeights(); - modifyHeights("0.27-10", 0, 0.1); - } - - function addMountain() { - var x = Math.floor(Math.random() * mapWidth / 3 + mapWidth / 3); - var y = Math.floor(Math.random() * mapHeight * 0.2 + mapHeight * 0.4); - var rnd = diagram.find(x, y).index; - var height = Math.random() * 0.1 + 0.9; - add(rnd, "mountain", height); - } - - function addHill(count, shift) { - // shift from 0 to 0.5 - for (c = 0; c < count; c++) { - var limit = 0; - do { - var height = Math.random() * 0.4 + 0.1; - var x = Math.floor(Math.random() * mapWidth * (1-shift*2) + mapWidth * shift); - var y = Math.floor(Math.random() * mapHeight * (1-shift*2) + mapHeight * shift); - var rnd = diagram.find(x, y).index; - limit ++; - } while (cells[rnd].height + height > 0.9 && limit < 100) - add(rnd, "hill", height); - } - } - - function add(start, type, height) { - var sharpness = 0.2; - var radius = 0.99; - if (type === "mountain") {radius = 0.9;} - var queue = []; // cells to check - var used = []; // used cells - cells[start].height += height; - cells[start].feature = undefined; - queue.push(start); - used.push(start); - for (i = 0; i < queue.length && height >= 0.01; i++) { - if (type == "mountain") { - height = +cells[queue[i]].height * radius - height / 100; - } else { - height *= radius; - } - cells[queue[i]].neighbors.forEach(function(e) { - if (used.indexOf(e) < 0) { - var mod = Math.random() * sharpness + 1.1 - sharpness; - if (sharpness == 0) {mod = 1;} - cells[e].height += height * mod; - if (cells[e].height > 1) {cells[e].height = 1;} - cells[e].feature = undefined; - queue.push(e); - used.push(e); - } - }); - } - } - - function addRange(mod, height, from, to) { - var count = Math.abs(mod); - for (c = 0; c < count; c++) { - var diff = 0; - var start = from; - var end = to; - if (!start || !end) { - do { - var xf = Math.floor(Math.random() * (mapWidth*0.7)) + mapWidth*0.15; - var yf = Math.floor(Math.random() * (mapHeight*0.6)) + mapHeight*0.2; - start = diagram.find(xf, yf).index; - var xt = Math.floor(Math.random() * (mapWidth*0.7)) + mapWidth*0.15; - var yt = Math.floor(Math.random() * (mapHeight*0.6)) + mapHeight*0.2; - end = diagram.find(xt, yt).index; - diff = Math.hypot(xt - xf, yt - yf); - } while (diff < 180 || diff > 400) - } - var range = []; - if (start && end) { - for (var l = 0; start != end && l < 1000; l++) { - var min = 10000; - cells[start].neighbors.forEach(function(e) { - diff = Math.hypot(cells[end].data[0] - cells[e].data[0], cells[end].data[1] - cells[e].data[1]); - if (Math.random() > 0.5) {diff = diff / 2} - if (diff < min) { - min = diff; - start = e; - } - }); - range.push(start); - } - } - if (range.length > 0) { - var change = height ? height + 0.2 : Math.random() * 0.2 + 0.2; - var query = []; - var used = []; - for (var i = 1; change >= 0.01; i++) { - var rnd = Math.random() * 0.4 + 0.8; - change -= i / 40 * rnd; - range.map(function(r) { - cells[r].neighbors.forEach(function(e) { - if (used.indexOf(e) == -1 && Math.random() > 0.2 && change > 0) { - query.push(e); - used.push(e); - if (mod > 0) { - cells[e].height += change; - if (cells[e].height > 1) {cells[e].height = 1;} - } else if (cells[e].height >= 0.2) { - cells[e].height -= change; - if (cells[e].height < 0.1) { - cells[e].height = 0.13 + i / 100; - if (cells[e].height >= 0.2) {cells[e].height = 0.19;} - } - } - } - }); - range = query.slice(); - }); - } - } - } - } - - function addStrait(width) { - var top = Math.floor(Math.random() * mapWidth * 0.3 + mapWidth * 0.35); - var bottom = Math.floor((mapWidth - top) - (mapWidth * 0.1) + (Math.random() * mapWidth * 0.2)); - var start = diagram.find(top, mapHeight * 0.1).index; - var end = diagram.find(bottom, mapHeight * 0.9).index; - var range = []; - for (var l = 0; start !== end && l < 1000; l++) { - var min = 10000; - cells[start].neighbors.forEach(function(e) { - diff = Math.hypot(cells[end].data[0] - cells[e].data[0], cells[end].data[1] - cells[e].data[1]); - if (Math.random() > 0.5) {diff = diff / 2} - if (diff < min) {min = diff; start = e;} - }); - range.push(start); - } - var query = [], used = []; - for (var i = 1; width > 0; i++) { - width --; - range.map(function(r) { - cells[r].neighbors.forEach(function(e) { - if (used.indexOf(e) == -1) { - query.push(e), used.push(e); - var height = (Math.floor(Math.random() * 101) + 100) / 1000; - cells[e].height = Math.trunc(height * 100) / 100; - } - }); - range = query.slice(); - }); - } - } - - function addPit(count, height, cell) { - for (c = 0; c < count; c++) { - var change = height ? height + 0.2 : Math.random() * 0.3 + 0.2; - var start = cell, used = []; - if (!start) { - var lowlands = $.grep(cells, function(e) {return (e.height >= 0.2);}); - if (lowlands.length == 0) {return;} - var rnd = Math.floor(Math.random() * lowlands.length); - start = lowlands[rnd].index; - } - var query = [start]; - for (var i = 1; change >= 0.01; i++) { - var rnd = Math.random() * 0.4 + 0.8; - change -= i / 60 * rnd; - query.map(function(p) { - cells[p].neighbors.forEach(function(e) { - if (used.indexOf(e) == -1 && change > 0) { - query.push(e); - used.push(e); - cells[e].height -= change; - if (cells[e].height < 0.1) { - cells[e].height = 0.1 + i / 100; - if (cells[e].height >= 0.2) {cells[e].height = 0.19;} - } - } - }); - }); - } - } - } - - // Modify heights multiplying/adding by value - function modifyHeights(type, add, mult) { - cells.map(function(i) { - if (type === "land") { - if (i.height >= 0.2) { - i.height += add; - var dif = i.height - 0.2; - var factor = mult; - if (mult == "^2") {factor = dif} - if (mult == "^3") {factor = dif * dif;} - i.height = 0.2 + dif * factor; - } - } else if (type === "all") { - if (i.height > 0) { - i.height += add; - i.height *= mult; - } - } else { - var interval = type.split("-"); - if (i.height >= +interval[0] && i.height <= +interval[1]) { - i.height += add; - i.height *= mult; - } - } - }); - } - - // Smooth heights using mean of neighbors - function smoothHeights() { - cells.map(function(i) { - var heights = [i.height]; - i.neighbors.forEach(function(e) {heights.push(cells[e].height);}); - i.height = d3.mean(heights); - }); - } - - // Get polygone neighbors and update their height with small optional modifier - function neighbors(i, height) { - cells[i].neighbors.forEach(function(e) { - if (!cells[e].used) { - var mod = Math.random() * sharpness + 1.1 - sharpness; - if (sharpness == 0.1) {mod = 1;} - cells[e].height += height * mod; - cells[e].used = 1; - queue.push(e); - } - }); - } - - // Mark features (ocean, lakes, islands) - function markFeatures() { - console.time("markFeatures"); - var queue = [], lake = 0, number = 0, type, greater = 0, less = 0; - // ensure all near border cells are ocean - cells.map(function(l) { - l.height = Math.trunc(l.height * 100) / 100; - if (l.type === -99) { - l.height = 0; - l.neighbors.forEach(function(e) {cells[e].height = 0;}); - } - }); - // start with top left corner to define Ocean first - var start = diagram.find(0, 0).index; - var unmarked = [cells[start]]; - while (unmarked.length > 0) { - if (unmarked[0].height >= 0.2) { - type = "Island"; - number = island; - island += 1; - greater = 0.2; - less = 100; // just to omit exclusion - } else { - type = "Lake"; - number = lake; - lake += 1; - greater = -100; // just to omit exclusion - less = 0.2; - } - if (type == "Lake" && number == 0) {type = "Ocean";} - start = unmarked[0].index; - queue.push(start); - cells[start].feature = type; - cells[start].featureNumber = number; - while (queue.length > 0) { - var i = queue[0]; - queue.shift(); - cells[i].neighbors.forEach(function(e) { - if (!cells[e].feature && cells[e].height >= greater && cells[e].height < less) { - cells[e].feature = type; - cells[e].featureNumber = number; - queue.push(e); - } - if (type == "Island" && cells[e].height < 0.2) { - cells[i].type = 2; - cells[e].type = -1; - if (cells[e].feature === "Ocean") { - if (cells[i].harbor) { - cells[i].harbor += 1; - } else { - cells[i].harbor = 1; - } - } - } - }); - } - unmarked = $.grep(cells, function(e) {return (!e.feature);}); - } - console.timeEnd("markFeatures"); - } - - function drawOcean() { - console.time("drawOcean"); - var limits = [], odd = 0.8; // initial odd for ocean layer is 80% - // Define type of ocean cells based on cell distance form land - var frontier = $.grep(cells, function(e) {return (e.type === -1);}); - if (Math.random() < odd) {limits.push(-1); odd = 0.3;} - for (var c = -2; frontier.length > 0 && c > -10; c--) { - if (Math.random() < odd) {limits.unshift(c); odd = 0.3;} else {odd += 0.2;} - frontier.map(function(i) { - i.neighbors.forEach(function(e) { - if (!cells[e].type) {cells[e].type = c;} - }); - }); - frontier = $.grep(cells, function(e) {return (e.type === c);}); - } - if (outlineLayers.value !== "random") {limits = outlineLayers.value.split(",");} - // Define area edges - for (var c = 0; c < limits.length; c++) { - var edges = []; - for (var i = 0; i < cells.length; i++) { - if (cells[i].feature === "Ocean" && cells[i].type >= limits[c]) { - var cell = diagram.cells[i]; - cell.halfedges.forEach(function(e) { - var edge = diagram.edges[e]; - if (edge.left && edge.right) { - var ea = edge.left.index; - if (ea === i) {ea = edge.right.index;} - var type = cells[ea].type; - if (type < limits[c] || type == undefined) { - var start = edge[0].join(" "); - var end = edge[1].join(" "); - edges.push({start, end}); - } - } else { - var start = edge[0].join(" "); - var end = edge[1].join(" "); - edges.push({start, end}); - } - }) - } - } - lineGen.curve(d3.curveBasisClosed); - var relax = 0.8 - c / 10; - if (relax < 0.2) {relax = 0.2}; - var line = getContinuousLine(edges, 0, relax); - oceanLayers.append("path").attr("d", line).attr("fill", "#ecf2f9").style("opacity", 0.4 / limits.length); - } - console.timeEnd("drawOcean"); - } - - // recalculate Voronoi Graph to pack cells - function reGraph() { - console.time("reGraph"); - var tempCells = [], newPoints = []; // to store new data - land = [], polygons= []; // clear old data - cells.map(function(i) { - var height = Math.trunc(i.height * 100) / 100; - var type = i.type || undefined; - if (type !== -1 && type !== -2 && height < 0.2) {return;} - var x = Math.round(i.data[0] * 10) / 10; - var y = Math.round(i.data[1] * 10) / 10; - var feature = i.feature; - var featureNumber = i.featureNumber; - var harbor = type === 2 ? +i.harbor : undefined; - var flux = y >= mapHeight / 2 ? 0.07 : 0.1; - var copy = $.grep(newPoints, function(e) {return (e[0] == x && e[1] == y);}); - if (!copy.length) { - newPoints.push([x, y]); - tempCells.push({index:tempCells.length, data:[x, y], height, type, feature, featureNumber, harbor, flux}); - } - if (type === 2 || type === -1) { // add additional points - i.neighbors.forEach(function(e) { - if (cells[e].type == type) { - var x1 = Math.ceil((x * 2 + cells[e].data[0]) / 3); - var y1 = Math.ceil((y * 2 + cells[e].data[1]) / 3); - copy = $.grep(newPoints, function(e) {return (e[0] == x1 && e[1] == y1);}); - if (!copy.length) { - newPoints.push([x1, y1]); - tempCells.push({index:tempCells.length, data:[x1, y1], height, type, feature, featureNumber, harbor, flux}); - } - }; - }); - } - }); - cells = tempCells; // use tempCells as the only cells array - calculateVoronoi(newPoints); // recalculate Voronoi diagram using new points - var gridPath = ""; // store grid as huge single path string - cells.map(function(i, d) { - gridPath += "M" + polygons[d].join("L") + "Z"; - var neighbors = []; // re-detect neighbors - diagram.cells[d].halfedges.forEach(function(e) { - var edge = diagram.edges[e], ea; - if (edge.left && edge.right) { - ea = edge.left.index; - if (ea === d) {ea = edge.right.index;} - neighbors.push(ea); - } - }) - i.neighbors = neighbors; - }); - grid.append("path").attr("d", round(gridPath)); - land = $.grep(cells, function(e) {return (e.height >= 0.2);}); - land.sort(function(a, b) {return b.height - a.height;}); - console.timeEnd("reGraph"); - } - - // Draw temp Heightmap for the Journey - function mockHeightmap() { - $("#landmass").empty(); - var elevation = []; - cells.map(function(i) { - if (i.height > 1) {i.height = 1;} - if (i.height < 0) {i.height = 0;} - if (i.height >= 0.2) { - elevation.push(i.height); - landmass.append("path") - .attr("d", "M" + polygons[i.index].join("L") + "Z") - .attr("fill", color(1 - i.height)) - .attr("stroke", color(1 - i.height)); - } - }); - var elevationAverage = Math.round(d3.mean(elevation) * 100) / 100; - var landRatio = Math.round(elevation.length / cells.length * 100) - landmassCounter.innerHTML = elevation.length + " (" + landRatio + "%); Average Elevation: " + elevationAverage; - if (elevation.length > 100) { - $("#getMap").attr("disabled", false).removeClass("buttonoff"); - } else { - $("#getMap").attr("disabled", true).addClass("buttonoff"); - } - if (elevation.length > 0) { - $("#featureIsland").attr("disabled", true).addClass("buttonoff"); - } else { - $("#featureIsland").attr("disabled", false).removeClass("buttonoff"); - } - } - - // Detect and draw the coasline - function drawCoastline() { - console.time('drawCoastline'); - $("#landmass").empty(); - var oceanEdges = [], lakeEdges = []; - var edges = diagram.edges; - for (var i = 0; i < edges.length; i++) { - var e = edges[i]; - if (!e) {continue;} - if (!e.left || !e.right) {continue;} - var l = cells[e.left.index], r = cells[e.right.index]; - if (l.height < 0.2 && r.height < 0.2) {continue;} - if (l.height >= 0.2 && r.height >= 0.2) {continue;} - var start = e[0].join(" "); - var end = e[1].join(" "); - if (l.height > r.height) {var land = l, water = r;} else {var land = r, water = l;} - var x = (e[0][0] + e[1][0]) / 2; - var y = (e[0][1] + e[1][1]) / 2; - if (water.feature === "Lake") { - lakeEdges.push({start, end}); - land.data[0] = x + (land.data[0] - x) * 0.4; - land.data[1] = y + (land.data[1] - y) * 0.4; - } else { - oceanEdges.push({start, end}); - if (land.type !== 1) { // locate place at shore - var coastX = x + (land.data[0] - x) * 0.12; - var coastY = y + (land.data[1] - y) * 0.12; - var pointX = x + (land.data[0] - x) * 0.4; - var pointY = y + (land.data[1] - y) * 0.4; - land.coastX = Math.round(coastX * 100) / 100; - land.coastY = Math.round(coastY * 100) / 100; - land.data[0] = Math.round(pointX * 100) / 100; - land.data[1] = Math.round(pointY * 100) / 100; - land.type = 1; - land.haven = water.index; // mark haven - } - } - } - getCurveType(); - var line = getContinuousLine(oceanEdges, 1.5, 0); - d3.select("#shape").append("path").attr("d", line).attr("fill", "white"); // draw the clippath - landmass.append("path").attr("d", line); // draw the landmass - coastline.append("path").attr("d", line); // draw the coastline - line = getContinuousLine(lakeEdges, 1.5, 0); - lakes.append("path").attr("d", line); // draw the lakes - console.timeEnd('drawCoastline'); - } - - function getContinuousLine(edges, indention, relax) { - var line = ""; - while (edges.length > 2) { - var edgesOrdered = []; // to store points in a correct order - var start = edges[0].start; - var end = edges[0].end; - edges.shift(); - var spl = start.split(" "); - edgesOrdered.push({scX: spl[0], scY: spl[1]}); - spl = end.split(" "); - edgesOrdered.push({scX: spl[0], scY: spl[1]}); - var x0 = +spl[0]; - var y0 = +spl[1]; - for (var i = 0; end !== start && i < 50000; i++) { - var next = $.grep(edges, function(e) {return (e.start == end || e.end == end);}); - if (!next.length) { - end = edges[0].end; - edges.shift(); - continue; - } - if (next[0].start == end) {end = next[0].end;} else {end = next[0].start;} - spl = end.split(" "); - var dist = Math.hypot(+spl[0] - x0, +spl[1] - y0); - if (dist >= indention && Math.random() > relax) { - edgesOrdered.push({scX: +spl[0], scY: +spl[1]}); - x0 = +spl[0], y0 = +spl[1]; - } - var rem = edges.indexOf(next[0]); - edges.splice(rem, 1); - } - line += lineGen(edgesOrdered) + "Z"; - } - return round(line); - } - - // Resolve Heightmap Depressions (for a correct water flux modeling) - function resolveDepressions() { - console.time('resolveDepressions'); - var depression = 1, limit = 100, minCell, minHigh; - for (var l = 0; depression > 0 && l < limit; l++) { - depression = 0; - for (var i = 0; i < land.length; i++) { - var heights = []; - land[i].neighbors.forEach(function(e) {heights.push(+cells[e].height);}); - var minHigh = d3.min(heights); - if (land[i].height <= minHigh) { - depression += 1; - land[i].height = minHigh + 0.01; - } - } - if (l === limit - 1) {console.error("Error: resolveDepressions iteration limit");} - } - console.timeEnd('resolveDepressions'); - } - - function flux() { - console.time('flux'); - riversData = []; - var riversOrder = [], riverNext = 0; - land.sort(function(a, b) {return b.height - a.height;}); - for (var i = 0; i < land.length; i++) { - var id = land[i].index; - var heights = []; - land[i].neighbors.forEach(function(e) {heights.push(cells[e].height);}); - var minId = heights.indexOf(d3.min(heights)); - var min = land[i].neighbors[minId]; - // Define river number - if (land[i].flux > 0.85) { - if (land[i].river == undefined) { - // State new River - land[i].river = riverNext; - riversData.push({river: riverNext, cell: id, x: land[i].data[0], y: land[i].data[1]}); - riverNext += 1; - } - // Assing existing River to the downhill cell - if (cells[min].river == undefined) { - cells[min].river = land[i].river; - } else { - var riverTo = cells[min].river; - var iRiver = $.grep(riversData, function(e) {return (e.river == land[i].river);}); - var minRiver = $.grep(riversData, function(e) {return (e.river == riverTo);}); - var iRiverL = iRiver.length; - var minRiverL = minRiver.length; - // re-assing river nunber if new part is greater - if (iRiverL >= minRiverL) { - cells[min].river = land[i].river; - iRiverL += 1; - minRiverL -= 1; - } - // mark confluences - if (cells[min].height >= 0.2 && iRiverL > 1 && minRiverL > 1) { - if (!cells[min].confluence) { - cells[min].confluence = minRiverL-1; - } else { - cells[min].confluence += minRiverL-1; - } - } - } - } - cells[min].flux = +(cells[min].flux+land[i].flux).toFixed(2); - if (land[i].river != undefined) { - var px = cells[min].data[0]; - var py = cells[min].data[1]; - if (cells[min].height < 0.2) { - // pour water to the Ocean - var sx = land[i].data[0]; - var sy = land[i].data[1]; - var x = (px + sx) / 2 + (px - sx) / 20; - var y = (py + sy) / 2 + (py - sy) / 20; - riversData.push({river: land[i].river, cell: id, x, y}); - } - else { - // add next River segment - riversData.push({river: land[i].river, cell: min, x: px, y: py}); - } - } - } - console.timeEnd('flux'); - drawRiverLines(riverNext); - } - - function drawRiverLines(riverNext) { - console.time('drawRiverLines'); - lineGen.curve(d3.curveCatmullRom.alpha(0.1)); - for (var i = 0; i < riverNext; i++) { - var dataRiver = $.grep(riversData, function(e) {return e.river === i;}); - if (dataRiver.length > 1) { - var riverAmended = amendRiver(dataRiver, 1); - var d = drawRiver(riverAmended); - rivers.append("path").attr("d", d).attr("data-points", JSON.stringify(riverAmended)); - } - } - rivers.selectAll("path").on("click", editRiver); - console.timeEnd('drawRiverLines'); - } - - // add more river points on 1/3 and 2/3 of length - function amendRiver(dataRiver, rndFactor) { - var riverAmended = [], side = 1; - for (var r = 0; r < dataRiver.length; r++) { - var dX = dataRiver[r].x; - var dY = dataRiver[r].y; - riverAmended.push({scX:dX, scY:dY}); - if (r+1 < dataRiver.length) { - var eX = dataRiver[r+1].x; - var eY = dataRiver[r+1].y; - var angle = Math.atan2(eY - dY, eX - dX); - var serpentine = 1 / (r+1); - var meandr = serpentine + 0.3 + Math.random() * 0.3 * rndFactor; - if (Math.random() > 0.5) {side *= -1}; - var dist = Math.hypot(eX - dX, eY - dY); - // if dist is big or river is small add 2 extra points - if (dist > 8 || (dist > 4 && dataRiver.length < 6)) { - var stX = (dX * 2 + eX) / 3; - var stY = (dY * 2 + eY) / 3; - var enX = (dX + eX * 2) / 3; - var enY = (dY + eY * 2) / 3; - stX += -Math.sin(angle) * meandr * side; - stY += Math.cos(angle) * meandr * side; - if (Math.random() > 0.8) {side *= -1}; - enX += Math.sin(angle) * meandr * side; - enY += -Math.cos(angle) * meandr * side; - riverAmended.push({scX:stX, scY:stY}, {scX:enX, scY:enY}); - // if dist is medium or river is small add 1 extra point - } else if (dist > 4 || dataRiver.length < 6) { - var scX = (dX + eX) / 2; - var scY = (dY + eY) / 2; - scX += -Math.sin(angle) * meandr * side; - scY += Math.cos(angle) * meandr * side; - riverAmended.push({scX, scY}); - } - } - } - return riverAmended; - } - - function drawRiver(riverPoints, startWidth, widening) { - var extraWidth = startWidth || 0.02; - var widening = widening || 250; - var d = lineGen(riverPoints); - var river = defs.append("path").attr("d", d); - var riverLength = river.node().getTotalLength(); - var riverPointsLeft = [], riverPointsRight = []; - for (var l=0; l < riverLength; l++) { - var point = river.node().getPointAtLength(l); - var cell = diagram.find(point.x, point.y, 1); - if (cell) { - var confluence = cells[cell.index].confluence; - if (confluence) {extraWidth += Math.atan(confluence / 100);} - } - var from = river.node().getPointAtLength(l - 0.1); - var to = river.node().getPointAtLength(l + 0.1); - var angle = Math.atan2(from.y - to.y, from.x - to.x); - var offset = Math.atan(l / widening) + extraWidth; - var xLeft = point.x + -Math.sin(angle) * offset; - var yLeft = point.y + Math.cos(angle) * offset; - riverPointsLeft.push({scX:xLeft, scY:yLeft}); - var xRight = point.x + Math.sin(angle) * offset; - var yRight = point.y + -Math.cos(angle) * offset; - riverPointsRight.unshift({scX:xRight, scY:yRight}); - } - var point = river.node().getPointAtLength(riverLength); - var from = river.node().getPointAtLength(riverLength - 0.1); - var angle = Math.atan2(from.y - point.y, from.x - point.x); - var offset = Math.atan(riverLength / widening) + extraWidth; - var xLeft = point.x + -Math.sin(angle) * offset; - var yLeft = point.y + Math.cos(angle) * offset; - riverPointsLeft.push({scX:xLeft, scY:yLeft}); - var xRight = point.x + Math.sin(angle) * offset; - var yRight = point.y + -Math.cos(angle) * offset; - riverPointsRight.unshift({scX:xRight, scY:yRight}); - river.remove(); - var right = lineGen(riverPointsRight); - var left = lineGen(riverPointsLeft); - left = left.substring(left.indexOf("C")); - var d = right + left + "Z"; - d = d.replace(/[\d\.-][\d\.e-]*/g, function(n) {return Math.round(n*100)/100;}); - return d; - } - - function editRiver() { - if (elSelected) { - if ($("#riverNew").hasClass('pressed')) { - var point = d3.mouse(this); - addRiverPoint({scX:point[0], scY:point[1]}); - redrawRiver(); - $("#riverNew").click(); - return; - } - elSelected.call(d3.drag().on("drag", null)).classed("draggable", false); - rivers.select(".riverPoints").remove(); - } - elSelected = d3.select(this); - elSelected.call(d3.drag().on("drag", riverDrag)).classed("draggable", true); - var points = JSON.parse(elSelected.attr("data-points")); - rivers.append("g").attr("class", "riverPoints").attr("transform", elSelected.attr("transform")); - points.map(function(p) {addRiverPoint(p)}); - var tr = parseTransform(elSelected.attr("transform")); - riverAngle.value = tr[2]; - riverAngleValue.innerHTML = Math.abs(+tr[2]) + "°"; - riverScale.value = tr[5]; - $("#riverEditor").dialog({ - title: "Edit River", - minHeight: 30, width: "auto", maxWidth: 275, resizable: false, - position: {my: "center top", at: "top", of: this} - }).on("dialogclose", function(event) { - if (elSelected) { - elSelected.call(d3.drag().on("drag", null)).classed("draggable", false); - rivers.select(".riverPoints").remove(); - $(".pressed").removeClass('pressed'); - viewbox.style("cursor", "default"); - } - }); - } - - function addRiverPoint(point) { - rivers.select(".riverPoints").append("circle") - .attr("cx", point.scX).attr("cy", point.scY).attr("r", 0.25) - .call(d3.drag().on("drag", riverPointDrag)) - .on("click", function(d) { - if ($("#riverRemovePoint").hasClass('pressed')) { - $(this).remove(); redrawRiver(); - } - if ($("#riverNew").hasClass('pressed')) { - $("#riverNew").click(); - } - }); - } - - $("#riverEditor .editButton, #riverEditor .editButtonS").click(function() { - if (this.id == "riverRemove") { - alertMessage.innerHTML = `Are you sure you want to remove the river?`; - $(function() {$("#alert").dialog({resizable: false, title: "Remove river", - buttons: { - "Remove": function() { - $(this).dialog("close"); - elSelected.remove(); - rivers.select(".riverPoints").remove(); - $("#riverEditor").dialog("close"); - }, - Cancel: function() {$(this).dialog("close");} - }}) - }); - return; - } - if (this.id == "riverCopy") { - var tr = parseTransform(elSelected.attr("transform")); - var d = elSelected.attr("d"); - var points = elSelected.attr("data-points"); - var x = 2, y = 2; - transform = `translate(${tr[0]-x},${tr[1]-y}) rotate(${tr[2]} ${tr[3]} ${tr[4]}) scale(${tr[5]})`; - while (rivers.selectAll("[transform='" + transform + "'][d='" + d + "']").size() > 0) { - x += 2; y += 2; - transform = `translate(${tr[0]-x},${tr[1]-y}) rotate(${tr[2]} ${tr[3]} ${tr[4]}) scale(${tr[5]})`; - } - rivers.append("path").attr("d", d).attr("data-points", points).attr("transform", transform).on("click", editRiver); - return; - } - if (this.id == "riverRenegerate") { - // restore main points - var points = JSON.parse(elSelected.attr("data-points")); - var riverCells = [], dataRiver = []; - for (var p = 0; p < points.length; p++) { - var cell = diagram.find(points[p].scX, points[p].scY, 1); - if (cell !== null && cell !== riverCells[riverCells.length-1]) {riverCells.push(cell);} - } - for (var c = 0; c < riverCells.length; c++) { - dataRiver.push({x:riverCells[c][0], y:riverCells[c][1]}); - } - // if last point not in cell center push it with one extra point - var last = points.pop(); - if (dataRiver[dataRiver.length-1].x !== last.scX) { - dataRiver.push({x:last.scX, y:last.scY}); - } - var rndFactor = 0.2 + Math.random() * 1.6; // random factor in range 0.2-1.8 - var riverAmended = amendRiver(dataRiver, rndFactor); - lineGen.curve(d3.curveCatmullRom.alpha(0.1)); - var startWidth = 0.01 + Math.random() * 0.04; - var widening = 100 + Math.random() * 150; - var d = drawRiver(riverAmended, startWidth, widening); - elSelected.attr("d", d).attr("data-points", JSON.stringify(riverAmended)); - rivers.select(".riverPoints").selectAll("*").remove(); - riverAmended.map(function(p) {addRiverPoint(p);}); - return; - } - if (this.id == "riverRisize") {$("#riverAngle, #riverAngleValue, #riverScaleIcon, #riverScale, #riverReset").toggle();} - if (this.id == "riverAddPoint" || this.id == "riverRemovePoint" || this.id == "riverNew") { - if ($(this).hasClass('pressed')) { - $(".pressed").removeClass('pressed'); - if (elSelected.attr("data-river") == "new") { - rivers.select(".riverPoints").selectAll("*").remove(); - elSelected.attr("data-river", ""); - elSelected.call(d3.drag().on("drag", riverDrag)).classed("draggable", true); - } - viewbox.style("cursor", "default"); - } else { - $(".pressed").removeClass('pressed'); - $(this).addClass('pressed'); - if (this.id == "riverAddPoint" || this.id == "riverNew") {viewbox.style("cursor", "crosshair");} - if (this.id == "riverNew") {rivers.select(".riverPoints").selectAll("*").remove();} - } - return; - } - if (this.id == "riverReset") { - elSelected.attr("transform", ""); - rivers.select(".riverPoints").attr("transform", ""); - riverAngle.value = 0; - riverAngleValue.innerHTML = "0°"; - riverScale.value = 1; - return; - } - $("#riverEditor .editButton").toggle(); - $(this).show().next().toggle(); - }); - - // on riverAngle change - $("#riverAngle").change(function() { - var tr = parseTransform(elSelected.attr("transform")); - riverAngleValue.innerHTML = Math.abs(+this.value) + "°"; - $(this).attr("title", $(this).val()); - var c = elSelected.node().getBBox(); - var angle = this.value; - var scale = +tr[5]; - transform = `translate(${tr[0]},${tr[1]}) rotate(${angle} ${(c.x+c.width/2)*scale} ${(c.y+c.height/2)*scale}) scale(${scale})`; - elSelected.attr("transform", transform); - rivers.select(".riverPoints").attr("transform", transform); - }); - - // on riverScale change - $("#riverScale").change(function() { - var tr = parseTransform(elSelected.attr("transform")); - $(this).attr("title", $(this).val()); - var scaleOld = +tr[5]; - var scale = +this.value; - var c = elSelected.node().getBBox(); - var cx = c.x+c.width/2; - var cy = c.y+c.height/2; - var trX = +tr[0] + cx * (scaleOld - scale); - var trY = +tr[1] + cy * (scaleOld - scale); - var scX = +tr[3] * scale/scaleOld; - var scY = +tr[4] * scale/scaleOld; - transform = `translate(${trX},${trY}) rotate(${tr[2]} ${scX} ${scY}) scale(${scale})`; - elSelected.attr("transform", transform); - rivers.select(".riverPoints").attr("transform", transform); - }); - - function riverDrag() { - var x = d3.event.x, y = d3.event.y; - var el = d3.select(this); - var tr = parseTransform(el.attr("transform")); - d3.event.on("drag", function() { - xc = d3.event.x, yc = d3.event.y; - var transform = `translate(${(+tr[0]+xc-x)},${(+tr[1]+yc-y)}) rotate(${tr[2]} ${tr[3]} ${tr[4]}) scale(${tr[5]})`; - el.attr("transform", transform); - rivers.select(".riverPoints").attr("transform", transform); - }); - } - - function parseTransform(string) { - // [translateX,translateY,rotateDeg,rotateX,rotateY,scale] - if (!string) {return [0,0,0,0,0,1];} - var a = string.replace(/[a-z()]/g,"").replace(/[ ]/g,",").split(","); - return [a[0] || 0, a[1] || 0, a[2] || 0, a[3] || 0, a[4] || 0, a[5] || 1]; - } - - function riverPointDrag() { - var x = d3.event.x, y = d3.event.y; - var el = d3.select(this); - d3.event - .on("drag", function() {el.attr("cx", d3.event.x).attr("cy", d3.event.y);}) - .on("end", function() { - if (Math.abs(d3.event.x - x) + Math.abs(d3.event.y - y) > 0) {redrawRiver();} - }); - } - - function redrawRiver() { - var points = []; - rivers.select(".riverPoints").selectAll("circle").each(function() { - var el = d3.select(this); - points.push({scX: +el.attr("cx"), scY: +el.attr("cy")}); - }); - lineGen.curve(d3.curveCatmullRom.alpha(0.1)); - var d = drawRiver(points); - elSelected.attr("d", d).attr("data-points", JSON.stringify(points)); - } - - function manorsAndRegions() { - console.group('manorsAndRegions'); - calculateChains(); - rankPlacesGeography(); - getCurveType(); - locateCultures(); - locateCapitals(); - generateMainRoads(); - rankPlacesEconomy(); - locateTowns(); - // temporary off as now there are too many islands and searoutes produce mess - //checkAccessibility(); - drawManors(); - defineRegions(); - drawRegions(); - generatePortRoads(); - generateSmallRoads(); - generateOceanRoutes(); - console.groupEnd('manorsAndRegions'); - } - - // Assess cells geographycal suitability for settlement - function rankPlacesGeography() { - console.time('rankPlacesGeography'); - land.map(function(c) { - var score = (1 - c.height) * 5; // base score from height (will be biom) - if (c.type && Math.random() < 0.8 && !c.river) { - c.score = 0; // ignore 80% of extended cells - } else { - if (c.type === 1 && c.harbor) { - score += 3 - c.harbor; // good sea harbor is valued - if (c.river && c.harbor === 1) {score += 3;} // estuaries are valued - } - if (c.flux > 1) {score += c.flux / 2;} // riverbank is valued - if (c.confluence) {score += c.confluence / 2;} // confluence is valued; - } - c.score = Math.floor(score); - }); - land.sort(compareScore); - console.timeEnd('rankPlacesGeography'); - } - - // Assess the cells economical suitability for settlement - function rankPlacesEconomy() { - console.time('rankPlacesEconomy'); - land.map(function(c) { - var score = c.score; - if (c.path) { - var path = Math.ceil(c.path / 15); - if (path < 1) {path = 1;} - if (path > 5) {path = 5;} - if (c.crossroad) {path *= 2;} // crossroads are valued - score += path; // roads are valued - } - c.score = Math.floor(Math.random() * score + score); // 0.5 random factor - }); - land.sort(compareScore); - console.timeEnd('rankPlacesEconomy'); - } - - function compareScore(a, b) { - if (a.score < b.score) return 1; - if (a.score > b.score) return -1; - return 0; - } - - // Locate cultures - function locateCultures() { - var cultureCenters = d3.range(7).map(function(d) {return [Math.random() * mapWidth, Math.random() * mapHeight];}); - cultureTree = d3.quadtree().extent([[0, 0], [mapHeight, mapWidth]]).addAll(cultureCenters);; - } - - function locateCapitals() { - console.time('locateCapitals'); - var spacing = mapWidth / capitalsCount; - manorTree = d3.quadtree().extent([[0, 0], [mapHeight, mapWidth]]); - if (power > 0) {spacing / power;} - console.log(" capitals: " + capitalsCount); - for (var l = 0; l < land.length && manors.length < capitalsCount; l++) { - var m = manors.length; - var dist = 10000; - if (l > 0) { - var closest = manorTree.find(land[l].data[0], land[l].data[1]); - dist = Math.hypot(land[l].data[0] - closest[0], land[l].data[1] - closest[1]); - } - if (dist >= spacing) { - if (land[l].harbor > 0 && land[l].type === 1) { - land[l].port = true; - land[l].data[0] = land[l].coastX; - land[l].data[1] = land[l].coastY; - } - if (land[l].river) { - var shift = Math.floor(0.2 * land[l].flux); - if (shift < 0.2) {shift = 0.2;} - if (shift > 1) {shift = 1;} - land[l].data[0] += shift - Math.random(); - land[l].data[1] += shift - Math.random(); - } - land[l].data[0] = +(land[l].data[0]).toFixed(2); - land[l].data[1] = +(land[l].data[1]).toFixed(2); - var cell = land[l].index; - queue.push(cell); - queue.push(...land[l].neighbors); - var closest = cultureTree.find(land[l].data[0], land[l].data[1]); - var culture = cultureTree.data().indexOf(closest); - var name = generateName(culture); - var capitalPower = Math.round((Math.random() * power / 2 + 1) * 10) / 10; - manors.push({i: m, cell, x: land[l].data[0], y: land[l].data[1], region: m, power: capitalPower, score: land[l].score, culture, name}); - manorTree.add([land[l].data[0], land[l].data[1]]); - } - if (l === land.length - 1) { - console.error("Cannot place capitals with current spacing. Trying again with reduced spacing"); - l = -1; - manors = []; - queue = []; - manorTree = d3.quadtree().extent([[0, 0], [mapHeight, mapWidth]]); - spacing /= 1.2; - } - } - manors.map(function(e, i) { - var p = cells[e.cell]; - p.manor = i; - p.region = i; - p.culture = e.culture; - }); - console.timeEnd('locateCapitals'); - } - - function locateTowns() { - console.time('locateTowns'); - for (var l = 0; l < land.length && manors.length < manorsCount; l++) { - if (queue.indexOf(land[l].index) == -1) { - if (land[l].harbor === 1 && land[l].type === 1) { - land[l].port = true; - land[l].data[0] = land[l].coastX; - land[l].data[1] = land[l].coastY; - } - queue.push(land[l].index); - if (land[l].type || Math.random() > 0.6) {queue.push(...land[l].neighbors);} - if (land[l].river) { - var shift = Math.floor(0.2 * land[l].flux); - if (shift < 0.2) {shift = 0.2;} - if (shift > 1) {shift = 1;} - land[l].data[0] += shift - Math.random(); - land[l].data[1] += shift - Math.random(); - } - land[l].data[0] = +(land[l].data[0]).toFixed(2); - land[l].data[1] = +(land[l].data[1]).toFixed(2); - var x = land[l].data[0]; - var y = land[l].data[1]; - var cell = land[l].index; - var region = "neutral", culture = -1, closest = neutral; - for (c = 0; c < capitalsCount; c++) { - var dist = Math.hypot(manors[c].x - x, manors[c].y - y) / manors[c].power; - var cap = manors[c].cell; - if (cells[cell].featureNumber !== cells[cap].featureNumber) {dist *= 3;} - if (dist < closest) {region = c; closest = dist;} - } - if (closest > neutral / 5 || region === "neutral") { - var closestCulture = cultureTree.find(x, y); - culture = cultureTree.data().indexOf(closestCulture); - } else { - culture = manors[region].culture; - } - var name = generateName(culture); - land[l].manor = manors.length; - land[l].culture = culture; - land[l].region = region; - manors.push({i: manors.length, cell, x, y, region, score: land[l].score, culture, name}); - } - if (l === land.length - 1) { - console.error("Cannot place all towns. Towns requested: " + manorsCount + ". Towns placed: " + manors.length); - } - } - console.timeEnd('locateTowns'); - } - - // Validate each island with manors has at least one port (so Island is accessible) - function checkAccessibility() { - console.time("checkAccessibility"); - for (var i = 0; i < island; i++) { - var manorsOnIsland = $.grep(land, function(e) {return (typeof e.manor !== "undefined" && e.featureNumber === i);}); - if (manorsOnIsland.length > 0) { - var ports = $.grep(manorsOnIsland, function(p) {return (p.port);}); - if (ports.length === 0) { - var portCandidates = $.grep(manorsOnIsland, function(c) {return (c.harbor && c.type === 1);}); - if (portCandidates.length > 0) { - console.error("No ports on Island " + manorsOnIsland[0].featureNumber + ". Upgrading first manor to port"); - portCandidates[0].harbor = 1; - portCandidates[0].port = true; - portCandidates[0].data[0] = portCandidates[0].coastX; - portCandidates[0].data[1] = portCandidates[0].coastY; - manors[portCandidates[0].manor].x = portCandidates[0].coastX; - manors[portCandidates[0].manor].y = portCandidates[0].coastY; - } else { - console.error("Cannot generate ports on Island " + manorsOnIsland[0].featureNumber + ". Removing " + manorsOnIsland.length + " manors"); - manorsOnIsland.map(function(e) { - manors.splice(e.manor, 1); - e.manor = undefined; - }); - } - } - } - } - console.timeEnd("checkAccessibility"); - } - - function generateMainRoads() { - console.time("generateMainRoads"); - for (var i = 0; i < island; i++) { - var manorsOnIsland = $.grep(land, function(e) {return (typeof e.manor !== "undefined" && e.featureNumber === i);}); - if (manorsOnIsland.length > 1) { - for (var d = 1; d < manorsOnIsland.length; d++) { - for (var m = 0; m < d; m++) { - var path = findLandPath(manorsOnIsland[d].index, manorsOnIsland[m].index, "main"); - restorePath(manorsOnIsland[m].index, manorsOnIsland[d].index, "main", path); - } - } - } - } - console.timeEnd("generateMainRoads"); - } - - function generatePortRoads() { - console.time("generatePortRoads"); - var landCapitals = $.grep(land, function(e) {return (e.manor < capitalsCount && !e.port);}); - landCapitals.map(function(e) { - var ports = $.grep(land, function(l) {return (l.port && l.region === e.manor);}); - var minDist = 1000, end = -1; - ports.map(function(p) { - var dist = Math.hypot(e.data[0] - p.data[0], e.data[1] - p.data[1]); - if (dist < minDist) {minDist = dist; end = p.index;} - }); - if (end !== -1) { - var start = e.index; - var path = findLandPath(start, end, "direct"); - restorePath(end, start, "main", path); - } - }); - console.timeEnd("generatePortRoads"); - } - - function generateSmallRoads() { - console.time("generateSmallRoads"); - lineGen.curve(d3.curveBasis); - console.log(" islands: " + island); - for (var i = 0; i < island; i++) { - var manorsOnIsland = $.grep(land, function(e) {return (typeof e.manor !== "undefined" && e.featureNumber === i);}); - var l = manorsOnIsland.length; - if (l > 1) { - var secondary = Math.floor((l + 8) / 10); - for (s = 0; s < secondary; s++) { - var start = manorsOnIsland[Math.floor(Math.random() * l)].index; - var end = manorsOnIsland[Math.floor(Math.random() * l)].index; - var dist = Math.hypot(cells[start].data[0] - cells[end].data[0], cells[start].data[1] - cells[end].data[1]); - if (dist > 10) { - var path = findLandPath(start, end, "direct"); - restorePath(end, start, "small", path); - } - } - manorsOnIsland.map(function(e, d) { - if (!e.path && d > 0) { - var start = e.index, end = -1; - var road = $.grep(land, function(e) {return (e.path && e.featureNumber === i);}); - if (road.length > 0) { - var minDist = 10000; - road.map(function(i) { - var dist = Math.hypot(e.data[0] - i.data[0], e.data[1] - i.data[1]); - if (dist < minDist) {minDist = dist; end = i.index;} - }); - } else { - end = manorsOnIsland[0].index; - } - var path = findLandPath(start, end, "main"); - restorePath(end, start, "small", path); - } - }); - } - } - console.timeEnd("generateSmallRoads"); - } - - function generateOceanRoutes() { - console.time("generateOceanRoutes"); - lineGen.curve(d3.curveBasis); - var ports = []; - for (var i = 0; i < island; i++) { - ports[i] = $.grep(land, function(e) {return (e.featureNumber === i && e.port);}); - if (!ports[i]) {ports[i] = [];} - } - ports.sort(function(a, b) {return a.length < b.length;}) - for (var i = 0; i < island; i++) { - if (ports[i].length === 0) {break;} - var length = ports[i].length; - ports[i].sort(function(a, b) {return a.score < b.score;}) - var start = ports[i][0].index; - var paths = findOceanPaths(start, -1); - /* draw anchor icons - for (var p = 0; p < ports[i].length; p++) { - var x0 = ports[i][p].data[0]; - var y0 = ports[i][p].data[1]; - var x1 = cells[h.haven].data[0]; - var y1 = cells[h.haven].data[1]; - var x = x0 + (x1 - x0) * 0.8; - var y = y0 + (y1 - y0) * 0.8; - icons.append("use").attr("xlink:href", "#icon-anchor").attr("x", x).attr("y", y).attr("width", 1).attr("height", 1); - } */ - for (var h = 1; h < length; h++) { - var end = ports[i][h].index; - restorePath(end, start, "ocean", paths); - } - for (var c = i + 1; c < island; c++) { - if (ports[c].length > 3 && length > 3) { - var end = ports[c][0].index; - restorePath(end, start, "ocean", paths); - } - } - if (length > 5) { - ports[i].sort(function(a, b) {return b.cost - a.cost;}); - for (var a = 2; a < length && a < 10; a++) { - var dist = Math.hypot(ports[i][1].data[0] - ports[i][a].data[0], ports[i][1].data[1] - ports[i][a].data[1]); - var distPath = getPathDist(ports[i][1].index, ports[i][a].index); - if (distPath > dist * 4 + 10) { - var totalCost = ports[i][1].cost + ports[i][a].cost; - var paths = findOceanPaths(ports[i][1].index, ports[i][a].index); - if (ports[i][a].cost < totalCost) { - restorePath(ports[i][a].index, ports[i][1].index, "ocean", paths); - break; - } - } - } - } - } - console.timeEnd("generateOceanRoutes"); - } - - function findLandPath(start, end, type) { - // A* algorithm - var queue = new PriorityQueue({comparator: function(a, b) {return a.p - b.p}}); - var cameFrom = []; - var costTotal = []; - costTotal[start] = 0; - queue.queue({e: start, p: 0}); - while (queue.length > 0) { - var next = queue.dequeue().e; - if (next === end) {break;} - var pol = cells[next]; - pol.neighbors.forEach(function(e) { - if (cells[e].height >= 0.2) { - var cost = cells[e].height * 2; - if (cells[e].path && type === "main") { - cost = 0.15; - } else { - if (typeof e.manor === "undefined") {cost += 0.1;} - if (typeof e.river !== "undefined") {cost -= 0.1;} - if (cells[e].type === 1) {cost *= 0.3;} - if (cells[e].path) {cost *= 0.5;} - cost += Math.hypot(cells[e].data[0] - pol.data[0], cells[e].data[1] - pol.data[1]) / 30; - } - var costNew = costTotal[next] + cost; - if (!cameFrom[e] || costNew < costTotal[e]) { // - costTotal[e] = costNew; - cameFrom[e] = next; - var dist = Math.hypot(cells[e].data[0] - cells[end].data[0], cells[e].data[1] - cells[end].data[1]) / 15; - var priority = costNew + dist; - queue.queue({e, p: priority}); - } - } - }); - } - return cameFrom; - } - - function findLandPaths(start, type) { - // Dijkstra algorithm - var queue = new PriorityQueue({comparator: function(a, b) {return a.p - b.p}}); - var cameFrom = []; - var costTotal = []; - cameFrom[start] = "no"; - costTotal[start] = 0; - queue.queue({e: start, p: 0}); - while (queue.length > 0) { - var next = queue.dequeue().e; - var pol = cells[next]; - pol.neighbors.forEach(function(e) { - var cost = cells[e].height; - if (cost >= 0.2) { - cost *= 2; - if (typeof e.river !== "undefined") {cost -= 0.2;} - if (pol.region !== cells[e].region) {cost += 1;} - if (cells[e].region === "neutral") {cost += 1;} - if (typeof e.manor !== "undefined") {cost = 0.1;} - var costNew = costTotal[next] + cost; - if (!cameFrom[e]) { - costTotal[e] = costNew; - cameFrom[e] = next; - queue.queue({e, p: costNew}); - } - } - }); - } - return cameFrom; - } - - function findOceanPaths(start, end) { - var queue = new PriorityQueue({comparator: function(a, b) {return a.p - b.p}}); - var next; - var cameFrom = []; - var costTotal = []; - cameFrom[start] = "no"; - costTotal[start] = 0; - queue.queue({e: start, p: 0}); - while (queue.length > 0 && next !== end) { - next = queue.dequeue().e; - var pol = cells[next]; - pol.neighbors.forEach(function(e) { - if (cells[e].type < 0 || cells[e].haven === next) { - var cost = 1; - if (cells[e].type > 0) {cost += 100;} - if (cells[e].type < -1) { - var dist = Math.hypot(cells[e].data[0] - pol.data[0], cells[e].data[1] - pol.data[1]); - cost += 50 + dist * 2; - } - if (cells[e].path && cells[e].type < 0) {cost *= 0.8;} - var costNew = costTotal[next] + cost; - if (!cameFrom[e]) { - costTotal[e] = costNew; - cells[e].cost = costNew; - cameFrom[e] = next; - queue.queue({e, p: costNew}); - } - } - }); - } - return cameFrom; - } - - function getPathDist(start, end) { - var queue = new PriorityQueue({comparator: function(a, b) {return a.p - b.p}}); - var next, costNew; - var cameFrom = []; - var costTotal = []; - cameFrom[start] = "no"; - costTotal[start] = 0; - queue.queue({e: start, p: 0}); - while (queue.length > 0 && next !== end) { - next = queue.dequeue().e; - var pol = cells[next]; - pol.neighbors.forEach(function(e) { - if (cells[e].path && (cells[e].type === -1 || cells[e].haven === next)) { - var dist = Math.hypot(cells[e].data[0] - pol.data[0], cells[e].data[1] - pol.data[1]); - costNew = costTotal[next] + dist; - if (!cameFrom[e]) { - costTotal[e] = costNew; - cameFrom[e] = next; - queue.queue({e, p: costNew}); - } - } - }); - } - return costNew; - } - - function restorePath(end, start, type, from) { - var path = [], current = end, limit = 300; - var prev = cells[end]; - if (type === "ocean" || !prev.path) {path.push({scX: prev.data[0], scY: prev.data[1]});} - if (!prev.path) {prev.path = 1;} - for (var i = 0; i < limit; i++) { - current = from[current]; - var cur = cells[current]; - if (!cur) {break;} - if (cur.path) { - cur.path += 1; - path.push({scX: cur.data[0], scY: cur.data[1]}); - prev = cur; - drawPath(); - } else { - cur.path = 1; - if (prev) {path.push({scX: prev.data[0], scY: prev.data[1]});} - prev = undefined; - path.push({scX: cur.data[0], scY: cur.data[1]}); - } - if (current === start || !from[current]) {break;} - } - drawPath(); - function drawPath() { - if (path.length > 1) { - var line = lineGen(path); - line = round(line); - if (type === "main") { - roads.append("path").attr("d", line).attr("data-start", start).attr("data-end", end); - } else if (type === "small") { - trails.append("path").attr("d", line); - } else if (type === "ocean") { - searoutes.append("path").attr("d", line); - } - } - path = []; - } - } - - // Append manors with random / generated names - // For each non-capital manor detect the closes capital (used for areas) - function drawManors() { - console.time('drawManors'); - for (var i = 0; i < manors.length; i++) { - var x = manors[i].x; - var y = manors[i].y; - var cell = manors[i].cell; - var name = manors[i].name; - if (i < capitalsCount) { - burgs.append("circle").attr("r", 1).attr("stroke-width", .24).attr("class", "manor").attr("cx", x).attr("cy", y); - capitals.append("text").attr("x", x).attr("y", y).attr("dy", -1.3).text(name); - } else { - burgs.append("circle").attr("r", .5).attr("stroke-width", .12).attr("class", "manor").attr("cx", x).attr("cy", y); - towns.append("text").attr("x", x).attr("y", y).attr("dy", -.7).text(name); - } - } - labels.selectAll("text").on("click", editLabel); - burgs.selectAll("circle").call(d3.drag().on("drag", dragged).on("end", dragended)).on("click", changeBurg); - console.timeEnd('drawManors'); - } - - // calculate Markov's chain from real data - function calculateChains() { - var vowels = "aeiouy"; - //var digraphs = ["ai","ay","ea","ee","ei","ey","ie","oa","oo","ow","ue","ch","ng","ph","sh","th","wh"]; - for (var l = 0; l < cultures.length; l++) { - var probs = []; // Coleshill -> co les hil l-com - var inline = manorNames[l].join(" ").toLowerCase(); - var syl = ""; - for (var i = -1; i < inline.length - 2;) { - if (i < 0) {var f = " ";} else {var f = inline[i];} - var str = "", vowel = 0; - for (var c = i+1; str.length < 5; c++) { - if (inline[c] === undefined) {break;} - str += inline[c]; - if (str === " ") {break;} - if (inline[c] !== "o" && inline[c] !== "e" && vowels.includes(inline[c]) && inline[c+1] === inline[c]) {break;} - if (inline[c+2] === " ") {str += inline[c+1]; break;} - if (vowels.includes(inline[c])) {vowel++;} - if (vowel && vowels.includes(inline[c+2])) {break;} - } - i += str.length; - probs[f] = probs[f] || []; - probs[f].push(str); - } - chain[l] = probs; - } - } - - // generate random name using Markov's chain - function generateName(culture) { - var data = chain[culture], res = "", next = data[" "]; - var cur = next[Math.floor(Math.random() * next.length)]; - while (res.length < 7) { - var l = cur.charAt(cur.length - 1); - if (cur !== " ") { - res += cur; - next = data[l]; - cur = next[Math.floor(Math.random() * next.length)]; - } else if (res.length > 2 + Math.floor(Math.random() * 5)) { - break; - } else { - next = data[" "]; - cur = next[Math.floor(Math.random() * next.length)]; - } - } - var name = res.charAt(0).toUpperCase() + res.slice(1); - return name; - } - - // Define areas based on the closest manor to a polygon - function defineRegions() { - console.time('defineRegions'); - manorTree = d3.quadtree().extent([[0, 0], [mapHeight, mapWidth]]); - manors.map(function(m) {manorTree.add([m.x, m.y]);}); - land.map(function(i) { - if (i.region === undefined) { - var closest = manorTree.find(i.data[0], i.data[1]); - var dist = Math.hypot(closest[0] - i.data[0], closest[1] - i.data[1]); - if (dist > neutral) { - i.region = "neutral"; - var closestCulture = cultureTree.find(i.data[0], i.data[1]); - i.culture = cultureTree.data().indexOf(closestCulture); - } else { - var manor = $.grep(manors, function(e) {return (e.x === closest[0] && e.y === closest[1]);}); - var cell = manor[0].cell; - if (cells[cell].featureNumber !== i.featureNumber) { - var minDist = dist * 3; - land.map(function(l) { - if (l.featureNumber === i.featureNumber && l.manor !== undefined) { - var distN = Math.hypot(l.data[0] - i.data[0], l.data[1] - i.data[1]); - if (distN < minDist) {minDist = distN; cell = l.index;} - } - }); - } - i.region = cells[cell].region; - i.culture = cells[cell].culture; - } - } - }); - console.timeEnd('defineRegions'); - } - - // Define areas cells - function drawRegions() { - console.time('drawRegions'); - var edges = [], borderEdges = [], coastalEdges = [], neutralEdges = []; // arrays to store edges - for (var i = 0; i < capitalsCount; i++) { - edges[i] = []; - land.map(function(p) { - if (p.region === i) { - var cell = diagram.cells[p.index]; - cell.halfedges.forEach(function(e) { - var edge = diagram.edges[e]; - if (edge.left && edge.right) { - var ea = edge.left.index; - if (ea === p.index) {ea = edge.right.index;} - var opp = cells[ea]; - if (opp.region !== i) { - var start = edge[0].join(" "); - var end = edge[1].join(" "); - edges[i].push({start, end}); - if (opp.height >= 0.2 && opp.region > i) {borderEdges.push({start, end});} - if (opp.height >= 0.2 && opp.region === "neutral") {neutralEdges.push({start, end});} - if (opp.height < 0.2) {coastalEdges.push({start, end});} - } - } - }) - } - }); - drawRegion(edges[i], i); - drawRegionCoast(coastalEdges, i); - } - drawBorders(borderEdges, "state"); - drawBorders(neutralEdges, "neutral"); - console.timeEnd('drawRegions'); - } - - function drawRegion(edges, region) { - var path = "", array = []; - lineGen.curve(d3.curveLinear); - while (edges.length > 2) { - var edgesOrdered = []; // to store points in a correct order - var start = edges[0].start; - var end = edges[0].end; - edges.shift(); - var spl = start.split(" "); - edgesOrdered.push({scX: spl[0], scY: spl[1]}); - spl = end.split(" "); - edgesOrdered.push({scX: spl[0], scY: spl[1]}); - for (var i = 0; end !== start && i < 2000; i++) { - var next = $.grep(edges, function(e) {return (e.start == end || e.end == end);}); - if (next.length > 0) { - if (next[0].start == end) { - end = next[0].end; - } else if (next[0].end == end) { - end = next[0].start; - } - spl = end.split(" "); - edgesOrdered.push({scX: spl[0], scY: spl[1]}); - } - var rem = edges.indexOf(next[0]); - edges.splice(rem, 1); - } - path += lineGen(edgesOrdered) + "Z "; - var edgesFormatted = []; - edgesOrdered.map(function(e) {edgesFormatted.push([+e.scX, +e.scY])}); - array[array.length] = edgesFormatted; - } - if (capitalsCount <= 8) { - var scheme = colors8; - } else { - var scheme = colors20; - } - var color = scheme(region / capitalsCount); - regions.append("path").attr("d", round(path)).attr("fill", color).attr("stroke", "none").attr("class", "region"+region); - array.sort(function(a, b){return b.length - a.length;}); - generateRegionName(array, region); - } - - function drawRegionCoast(edges, region) { - var path = ""; - while (edges.length > 0) { - var edgesOrdered = []; // to store points in a correct order - var start = edges[0].start; - var end = edges[0].end; - edges.shift(); - var spl = start.split(" "); - edgesOrdered.push({scX: spl[0], scY: spl[1]}); - spl = end.split(" "); - edgesOrdered.push({scX: spl[0], scY: spl[1]}); - var next = $.grep(edges, function(e) {return (e.start == end || e.end == end);}); - while (next.length > 0) { - if (next[0].start == end) { - end = next[0].end; - } else if (next[0].end == end) { - end = next[0].start; - } - spl = end.split(" "); - edgesOrdered.push({scX: spl[0], scY: spl[1]}); - var rem = edges.indexOf(next[0]); - edges.splice(rem, 1); - next = $.grep(edges, function(e) {return (e.start == end || e.end == end);}); - } - path += lineGen(edgesOrdered); - } - if (capitalsCount <= 8) { - var scheme = colors8; - } else { - var scheme = colors20; - } - var color = scheme(region / capitalsCount); - regions.append("path").attr("d", round(path)).attr("fill", "none").attr("stroke", color).attr("stroke-width", 1.5).attr("class", "region"+region); - } - - function drawBorders(edges, type) { - var path = ""; - while (edges.length > 0) { - var edgesOrdered = []; // to store points in a correct order - var start = edges[0].start; - var end = edges[0].end; - edges.shift(); - var spl = start.split(" "); - edgesOrdered.push({scX: spl[0], scY: spl[1]}); - spl = end.split(" "); - edgesOrdered.push({scX: spl[0], scY: spl[1]}); - var next = $.grep(edges, function(e) {return (e.start == end || e.end == end);}); - while (next.length > 0) { - if (next[0].start == end) { - end = next[0].end; - } else if (next[0].end == end) { - end = next[0].start; - } - spl = end.split(" "); - edgesOrdered.push({scX: spl[0], scY: spl[1]}); - var rem = edges.indexOf(next[0]); - edges.splice(rem, 1); - next = $.grep(edges, function(e) {return (e.start == end || e.end == end);}); - } - path += lineGen(edgesOrdered); - } - if (type === "state") {stateBorders.append("path").attr("d", round(path));} - if (type === "neutral") {neutralBorders.append("path").attr("d", round(path));} - } - - // generate region name and place label at pole of inaccessibility of the largest continuous element of the region - function generateRegionName(array, region) { - var name; - var culture = manors[region].culture; - var c = polylabel(array, 1.0); // pole of inaccessibility - // get source name (capital name = 20%; random name = 80%) - if (Math.random() < 0.8) { - name = generateName(culture); - } else { - name = manors[region].name; - } - name = addRegionSuffix(name, culture); - countries.append("text").attr("x", c[0].toFixed(2)).attr("y", c[1].toFixed(2)).text(name).on("click", editLabel); - } - - function addRegionSuffix(name, culture) { - var suffix = "ia"; // common latin suffix - var vowels = "aeiouy"; - if (Math.random() < 0.05 && (culture == 3 || culture == 4)) {suffix = "terra";} // 5% "terra" for Italian and Spanish - if (Math.random() < 0.05 && culture == 2) {suffix = "terre";} // 5% "terre" for French - if (Math.random() < 0.5 && culture == 0) {suffix = "land";} // 50% "land" for German - if (Math.random() < 0.33 && (culture == 1 || culture == 6)) {suffix = "land";} // 33% "land" for English and Scandinavian - if (culture == 5 && name.slice(-2) === "sk") {name.slice(0,-2);} // exclude -sk suffix for Slavic - if (name.indexOf(suffix) !== -1) {suffix = "";} // null suffix if name already contains it - var ending = name.slice(-1); - if (vowels.includes(ending) && name.length > 3) { - if (Math.random() > 0.2) { - ending = name.slice(-2,-1); - if (vowels.includes(ending)) { - name = name.slice(0,-2) + suffix; // 80% for vv - } else if (Math.random() > 0.2) { - name = name.slice(0,-1) + suffix; // 64% for cv - } - } - } else if (Math.random() > 0.5) { - name += suffix // 50% for cc - } - //if (name.slice(-2) !== "ia" && culture == 5 && Math.random() > 0.5) {name += "skaya Zemya";} // special case for Slavic - if (name.slice(-4) === "berg") {name += suffix;} // special case for -berg - return name; - } - - // draw the Heightmap - function toggleHeight() { - var scheme = styleSchemeInput.value; - var hColor = color; - if (scheme === "light") {hColor = d3.scaleSequential(d3.interpolateRdYlGn);} - if (scheme === "green") {hColor = d3.scaleSequential(d3.interpolateGreens);} - if (scheme === "monochrome") {hColor = d3.scaleSequential(d3.interpolateGreys);} - if (terrs.selectAll("path").size() == 0) { - land.map(function(i) { - terrs.append("path") - .attr("d", "M" + polygons[i.index].join("L") + "Z") - .attr("fill", hColor(1 - i.height)) - .attr("stroke", hColor(1 - i.height)); - }); - } else { - terrs.selectAll("path").remove(); - } - } - - // draw Cultures - function toggleCultures() { - if (cults.selectAll("path").size() == 0) { - land.map(function(i) { - cults.append("path") - .attr("d", "M" + polygons[i.index].join("L") + "Z") - .attr("fill", colors8(i.culture / cultures.length)) - .attr("stroke", colors8(i.culture / cultures.length)); - }); - } else { - cults.selectAll("path").remove(); - } - } - - // Draw the water flux system (for dubugging) - function toggleFlux() { - var colorFlux = d3.scaleSequential(d3.interpolateBlues); - if (terrs.selectAll("path").size() == 0) { - land.map(function(i) { - terrs.append("path") - .attr("d", "M" + polygons[i.index].join("L") + "Z") - .attr("fill", colorFlux(0.1 + i.flux)) - .attr("stroke", colorFlux(0.1 + i.flux)); - }); - } else { - terrs.selectAll("path").remove(); - } - } - - // Draw the Relief (need to create more beautiness) - function drawRelief() { - console.time('drawRelief'); - var ea, edge, id, cell, x, y, height, path, dash = "", rnd; - var hill = [], hShade = [], swamp = "", swampCount = 0, forest = "", fShade = "", fLight = "", swamp = ""; - hill[0] = "", hill[1] = "", hShade[0] = "", hShade[1] = ""; - var strokes = terrain.append("g").attr("id", "strokes"), - hills = terrain.append("g").attr("id", "hills"), - mounts = terrain.append("g").attr("id", "mounts"), - swamps = terrain.append("g").attr("id", "swamps"), - forests = terrain.append("g").attr("id", "forests"); - // sort the land to Draw the top element first (reduce the elements overlapping) - land.sort(compareY); - for (i = 0; i < land.length; i++) { - x = land[i].data[0]; - y = land[i].data[1]; - height = land[i].height; - if (height >= 0.7 && !land[i].river) { - h = (height - 0.55) * 12; - if (height < 0.8) { - count = 2; - } else { - count = 1; - } - rnd = Math.random() * 0.8 + 0.2; - for (c = 0; c < count; c++) { - cx = x - h * 0.9 - c; - cy = y + h / 4 + c / 2; - path = "M " + cx + "," + cy + " L " + (cx + h / 3 + rnd) + "," + (cy - h / 4 - rnd * 1.2) + " L " + (cx + h / 1.1) + "," + (cy - h) + " L " + (cx + h + rnd) + "," + (cy - h / 1.2 + rnd) + " L " + (cx + h * 2) + "," + cy; - mounts.append("path").attr("d", path).attr("stroke", "#5c5c70"); - path = "M " + cx + "," + cy + " L " + (cx + h / 3 + rnd) + "," + (cy - h / 4 - rnd * 1.2) + " L " + (cx + h / 1.1) + "," + (cy - h) + " L " + (cx + h / 1.5) + "," + cy; - mounts.append("path").attr("d", path).attr("fill", "#999999"); - dash += "M" + (cx - 0.1) + "," + (cy + 0.3) + " L" + (cx + 2 * h + 0.1) + "," + (cy + 0.3); - } - dash += "M" + (cx + 0.4) + "," + (cy + 0.6) + " L" + (cx + 2 * h - 0.3) + "," + (cy + 0.6); - } else if (height > 0.5 && !land[i].river) { - h = (height - 0.4) * 10; - count = Math.floor(4 - h); - if (h > 1.8) { - h = 1.8 - } - for (c = 0; c < count; c++) { - cx = x - h - c; - cy = y + h / 4 + c / 2; - hill[c] += "M" + cx + "," + cy + " Q" + (cx + h) + "," + (cy - h) + " " + (cx + 2 * h) + "," + cy; - hShade[c] += "M" + (cx + 0.6 * h) + "," + (cy + 0.1) + " Q" + (cx + h * 0.95) + "," + (cy - h * 0.91) + " " + (cx + 2 * h * 0.97) + "," + cy; - dash += "M" + (cx - 0.1) + "," + (cy + 0.2) + " L" + (cx + 2 * h + 0.1) + "," + (cy + 0.2); - } - dash += "M" + (cx + 0.4) + "," + (cy + 0.4) + " L" + (cx + 2 * h - 0.3) + "," + (cy + 0.4); - } - if (height >= 0.21 && height < 0.22 && !land[i].river && swampCount < swampiness && land[i].used != 1) { - swampCount++; - land[i].used = 1; - swamp += drawSwamp(x, y); - id = land[i].index; - cell = diagram.cells[id]; - cell.halfedges.forEach(function(e) { - edge = diagram.edges[e]; - ea = edge.left.index; - if (ea === id || !ea) { - ea = edge.right.index; - } - if (cells[ea].height >= 0.2 && cells[ea].height < 0.3 && !cells[ea].river && cells[ea].used != 1) { - cells[ea].used = 1; - swamp += drawSwamp(cells[ea].data[0], cells[ea].data[1]); - } - }) - } - if (Math.random() < height && height >= 0.22 && height < 0.48 && !land[i].river) { - for (c = 0; c < Math.floor(height * 8); c++) { - h = 0.6; - if (c == 0) { - cx = x - h - Math.random(); - cy = y - h - Math.random(); - } - if (c == 1) { - cx = x + h + Math.random(); - cy = y + h + Math.random(); - } - if (c == 2) { - cx = x - h - Math.random(); - cy = y + 2 * h + Math.random(); - } - forest += "M " + cx + " " + cy + " q -1 0.8 -0.05 1.25 v 0.75 h 0.1 v -0.75 q 0.95 -0.47 -0.05 -1.25 z"; - fLight += "M " + cx + " " + cy + " q -1 0.8 -0.05 1.25 h 0.1 q 0.95 -0.47 -0.05 -1.25 z"; - fShade += "M " + cx + " " + cy + " q -1 0.8 -0.05 1.25 q -0.2 -0.55 0 -1.1 z"; - } - } - } - // draw all these stuff - strokes.append("path").attr("d", round(dash)); - hills.append("path").attr("d", round(hill[0])).attr("stroke", "#5c5c70"); - hills.append("path").attr("d", round(hShade[0])).attr("fill", "white"); - hills.append("path").attr("d", round(hill[1])).attr("stroke", "#5c5c70"); - hills.append("path").attr("d", round(hShade[1])).attr("fill", "white").attr("stroke", "white"); - swamps.append("path").attr("d", round(swamp)); - forests.append("path").attr("d", forest); - forests.append("path").attr("d", fLight).attr("fill", "white").attr("stroke", "none"); - forests.append("path").attr("d", fShade).attr("fill", "#999999").attr("stroke", "none"); - console.timeEnd('drawRelief'); - } - - function compareY(a, b) { - if (a.data[1] > b.data[1]) return 1; - if (a.data[1] < b.data[1]) return -1; - return 0; - } - - function drawSwamp(x, y) { - var h = 0.6, line = ""; - for (c = 0; c < 3; c++) { - if (c == 0) { - cx = x; - cy = y - 0.5 - Math.random(); - } - if (c == 1) { - cx = x + h + Math.random(); - cy = y + h + Math.random(); - } - if (c == 2) { - cx = x - h - Math.random(); - cy = y + 2 * h + Math.random(); - } - line += "M" + cx + "," + cy + " H" + (cx - h / 6) + " M" + cx + "," + cy + " H" + (cx + h / 6) + " M" + cx + "," + cy + " L" + (cx - h / 3) + "," + (cy - h / 2) + " M" + cx + "," + cy + " V" + (cy - h / 1.5) + " M" + cx + "," + cy + " L" + (cx + h / 3) + "," + (cy - h / 2); - line += "M" + (cx - h) + "," + cy + " H" + (cx - h / 2) + " M" + (cx + h / 2) + "," + cy + " H" + (cx + h); - } - return line; - } - - function dragged(e) { - var el = d3.select(this); - var x = d3.event.x; - var y = d3.event.y; - el.raise().classed("drag", true); - if (el.attr("x")) { - el.attr("x", x).attr("y", y + 0.8); - var matrix = el.attr("transform"); - if (matrix) { - var angle = matrix.split('(')[1].split(')')[0].split(' ')[0]; - var bbox = el.node().getBBox(); - var rotate = "rotate("+ angle + " " + (bbox.x + bbox.width/2) + " " + (bbox.y + bbox.height/2) + ")"; - el.attr("transform", rotate); - } - } else { - el.attr("cx", x).attr("cy", y); - } - } - - function dragended(d) { - d3.select(this).classed("drag", false); - } - - // Complete the map for the "customize" mode - function getMap() { - exitCustomization(); - console.time("TOTAL"); - markFeatures(); - drawOcean(); - reGraph(); - resolveDepressions(); - flux(); - drawRelief(); - drawCoastline(); - manorsAndRegions(); - console.timeEnd("TOTAL"); - } - - // Add label or burg on mouseclick - function clicked() { - var brush = $("#options .pressed").attr("id"); - var point = d3.mouse(this); - if (brush === "addLabel" || brush === "addBurg") { - var rnd = Math.floor(Math.random() * cultures.length); - var name = generateName(rnd); - if (brush === "addLabel") { - countries.append("text").attr("x", point[0]).attr("y", point[1]).text(name).on("click", editLabel); - } else { - burgs.append("circle").attr("r", 1).attr("stroke-width", .24) - .attr("cx", point[0]).attr("cy", point[1]) - .call(d3.drag().on("drag", dragged).on("end", dragended)).on("click", changeBurg); - capitals.append("text").attr("x", point[0]).attr("y", point[1]).attr("dy", -1.3).text(name).on("click", editLabel); - } - return; - } - if (customization === 1 && brush) { - var cell = diagram.find(point[0], point[1]).index; - var power = +brushPower.value; - if (brush === "brushElevate") {cells[cell].height = +cells[cell].height + power;} - if (brush === "brushDepress") {cells[cell].height = +cells[cell].height - power;} - if (brush === "brushHill") {add(cell, "hill", power);} - if (brush === "brushPit") {addPit(1, power, cell);} - if (brush === "brushRange" || brush === "brushTrough") { - if (icons.selectAll(".tag").size() === 0) { - icons.append("circle").attr("r", 3).attr("class", "tag").attr("cx", point[0]).attr("cy", point[1]); - } else { - var x = +icons.select(".tag").attr("cx"); - var y = +icons.select(".tag").attr("cy"); - var from = diagram.find(x, y).index; - icons.selectAll(".tag, .line").remove(); - addRange(brush === "brushRange" ? 1 : -1, power, from, cell); - } - } - mockHeightmap(); - } - // add new river point if elSelected is river (has data-points) and add button pressed - if (!elSelected) {return;} - if (elSelected.attr("data-points")) { - if ($("#riverAddPoint").hasClass('pressed')) { - var dists = [], points = []; - var tr = parseTransform(elSelected.attr("transform")); - if (tr[5] == "1") { - point[0] -= +tr[0]; - point[1] -= +tr[1]; - } - rivers.select(".riverPoints").selectAll("circle").each(function() { - var x = +d3.select(this).attr("cx"); - var y = +d3.select(this).attr("cy"); - dists.push(Math.hypot(point[0] - x, point[1] - y)); - points.push({scX:x, scY:y}); - }).remove(); - var index = dists.length; - if (points.length > 1) { - var sorded = dists.slice(0).sort(function(a, b) {return a-b;}); - var closest = dists.indexOf(sorded[0]); - var next = dists.indexOf(sorded[1]); - if (closest <= next) {index = closest+1;} else {index = next+1;} - } - points.splice(index, 0, {scX:point[0], scY:point[1]}); - lineGen.curve(d3.curveCatmullRom.alpha(0.1)); - var d = drawRiver(points); - elSelected.attr("d", d).attr("data-points", JSON.stringify(points)); - points.map(function(p) {addRiverPoint(p)}); - return; - } - if ($("#riverNew").hasClass('pressed')) { - if (elSelected.attr("data-river") !== "new") { - elSelected.call(d3.drag().on("drag", null)).classed("draggable", false); - elSelected = rivers.append("path").attr("data-river", "new").on("click", editRiver); - } - addRiverPoint({scX:point[0], scY:point[1]}); - redrawRiver(); - return; - } - } - } - - // Change burg marker size on click - function changeBurg() { - var size = this.getAttribute("r"); - size = +size + .25; - if (size > 1.5) {size = .5;} - var width = this.getAttribute("stroke-width"); - width = +width + .06; - if (width > .36) {width = .12;} - var type = this.getAttribute("class"); - if (type) { - d3.selectAll("."+type).attr("r", size).attr("stroke-width", width); - } else { - this.setAttribute("r", size); - this.setAttribute("stroke-width", width); - } - } - - function editLabel() { - if (elSelected) { - elSelected.call(d3.drag().on("drag", null)).classed("draggable", false); - } - elSelected = d3.select(this); - elSelected.call(d3.drag().on("drag", dragged).on("end", dragended)).classed("draggable", true); - var group = d3.select(this.parentNode); - updateGroupOptions(); - editGroupSelect.value = group.attr("id"); - editFontSelect.value = fonts.indexOf(group.attr("data-font")); - editSize.value = group.attr("font-size"); - editColor.value = toHEX(group.attr("fill")); - editOpacity.value = group.attr("opacity"); - editText.value = elSelected.text(); - var matrix = elSelected.attr("transform"); - if (matrix) { - var rotation = matrix.split('(')[1].split(')')[0].split(' ')[0]; - } else { - var rotation = 0; - } - editAngle.value = rotation; - editAngleValue.innerHTML = rotation + "°"; - $("#labelEditor").dialog({ - title: "Edit Label: " + editText.value, - minHeight: 30, width: "auto", maxWidth: 275, resizable: false, - position: {my: "center top", at: "bottom", of: this} - }); - // fetch default fonts if not done before - if (fonts.indexOf("Bitter") === -1) { - $("head").append(''); - fonts = ["Amatic+SC:700", "IM+Fell+English", "Great+Vibes", "Bitter", "Yellowtail", "Montez", "Lobster", "Josefin+Sans", "Shadows+Into+Light", "Orbitron", "Dancing+Script:700", "Bangers", "Chewy", "Architects+Daughter", "Kaushan+Script", "Gloria+Hallelujah", "Satisfy", "Comfortaa:700", "Cinzel"]; - updateFontOptions(); - } - } - - $("#labelEditor .editButton, #labelEditor .editButtonS").click(function() { - var group = d3.select(elSelected.node().parentNode); - if (this.id == "editRemoveSingle") { - alertMessage.innerHTML = "Are you sure you want to remove the label?"; - $(function() {$("#alert").dialog({resizable: false, title: "Remove label", - buttons: { - "Remove": function() { - $(this).dialog("close"); - elSelected.remove(); - $("#labelEditor").dialog("close"); - }, - Cancel: function() {$(this).dialog("close");} - }}) - }); - return; - } - if (this.id == "editGroupRemove") { - var count = group.selectAll("text").size() - if (count < 2) { - group.remove(); - $("#labelEditor").dialog("close"); - return; - } - var message = "Are you sure you want to remove all labels (" + count + ") of that group?"; - alertMessage.innerHTML = message; - $(function() {$("#alert").dialog({resizable: false, title: "Remove labels", - buttons: { - "Remove": function() { - $(this).dialog("close"); - group.remove(); - $("#labelEditor").dialog("close"); - }, - Cancel: function() {$(this).dialog("close");} - }}) - }); - return; - } - if (this.id == "editCopy") { - var shift = +group.attr("font-size") + 1; - var xn = +elSelected.attr("x") - shift; - var yn = +elSelected.attr("y") - shift; - while (group.selectAll("text[x='" + xn + "']").size() > 0) {xn -= shift; yn -= shift;} - group.append("text").attr("x", xn).attr("y", yn).text(elSelected.text()) - .attr("transform", elSelected.attr("transform")).on("click", editLabel); - return; - } - if (this.id == "editGroupNew") { - if ($("#editGroupInput").css("display") === "none") { - $("#editGroupInput").css("display", "inline-block"); - $("#editGroupSelect").css("display", "none"); - editGroupInput.focus(); - } else { - $("#editGroupSelect").css("display", "inline-block"); - $("#editGroupInput").css("display", "none"); - } - return; - } - if (this.id == "editExternalFont") { - if ($("#editFontInput").css("display") === "none") { - $("#editFontInput").css("display", "inline-block"); - $("#editFontSelect").css("display", "none"); - editFontInput.focus(); - } else { - $("#editFontSelect").css("display", "inline-block"); - $("#editFontInput").css("display", "none"); - } - return; - } - if (this.id == "editTextRandom") { - var culture, index; - // check if label is manor name to get culture - var manor = $.grep(manors, function(e) {return (e.name === editText.value);}); - if (manor.length === 1) { - culture = manor[0].culture; - index = manor[0].i; - } else { - // if not get cell's culture at BBox centre - var c = elSelected.node().getBBox(); - var x = c.x + c.width / 2; - var y = c.y + c.height / 2; - culture = diagram.find(x, y).culture; - if (!culture) {culture = 0;} - } - var name = generateName(culture); - if (group.attr("id") === "countries") {name = addRegionSuffix(name, culture);} - editText.value = name; - elSelected.text(name); - $("div[aria-describedby='labelEditor'] .ui-dialog-title").text("Edit Label: " + name); - if (manor.length === 1) {manors[index].name = name;} - return; - } - $("#labelEditor .editButton").toggle(); - if (this.id == "editGroupButton") { - if ($("#editGroupInput").css("display") !== "none") {$("#editGroupSelect").css("display", "inline-block");} - if ($("#editGroupRemove").css("display") === "none") { - $("#editGroupRemove, #editGroupNew").css("display", "inline-block"); - } else { - $("#editGroupInput, #editGroupRemove, #editGroupNew").css("display", "none"); - } - } - if (this.id == "editFontButton") {$("#editSizeIcon, #editFontSelect, #editSize").toggle();} - if (this.id == "editStyleButton") {$("#editOpacityIcon, #editOpacity, #editShadowIcon, #editShadow").toggle();} - if (this.id == "editAngleButton") {$("#editAngleValue").toggle();} - if (this.id == "editTextButton") {$("#editTextRandom").toggle();} - $(this).show().next().toggle(); - }); - - function updateGroupOptions() { - editGroupSelect.innerHTML = ""; - labels.selectAll("g").each(function(d) { - var opt = document.createElement("option"); - opt.value = opt.innerHTML = d3.select(this).attr("id"); - editGroupSelect.add(opt); - }); - } - - // on editAngle change - $("#editAngle").change(function() { - var c = elSelected.node().getBBox(); - var rotate = `rotate(${this.value} ${(c.x+c.width/2)} ${(c.y+c.height/2)})`; - elSelected.attr("transform", rotate); - }); - - // on editFontInput change. Use a direct link to any @font-face declaration or just font name to fetch from Google Fonts - $("#editFontInput").change(function() { - if (editFontInput.value !== "") { - var url = (editFontInput.value).replace(/ /g, "+"); - if (url.indexOf("http") === -1) {url = "https://fonts.googleapis.com/css?family=" + url;} - addFonts(url); - editFontInput.value = ""; - editExternalFont.click(); - } - }); - - function addFonts(url) { - $('head').append(''); - return fetch(url) - .then(resp => resp.text()) - .then(text => { - let s = document.createElement('style'); - s.innerHTML = text; - document.head.appendChild(s); - let styleSheet = Array.prototype.filter.call( - document.styleSheets, - sS => sS.ownerNode === s)[0]; - let FontRule = rule => { - let family = rule.style.getPropertyValue('font-family'); - let weight = rule.style.getPropertyValue('font-weight'); - let font = family.replace(/['"]+/g, '').replace(/ /g, "+") + ":" + weight; - if (fonts.indexOf(font) == -1) {fonts.push(font);} - }; - for (var r of styleSheet.cssRules) {FontRule(r);} - document.head.removeChild(s); - updateFontOptions(); - }) - } - - // on any Editor input change - $("#labelEditor .editTrigger").change(function() { - $(this).attr("title", $(this).val()); - elSelected.text(editText.value); - // check if Group was changed - var group = d3.select(elSelected.node().parentNode); - var groupOld = group.attr("id"); - var groupNew = editGroupSelect.value; - if (editGroupInput.value !== "") { - groupNew = editGroupInput.value.toLowerCase().replace(/ /g, "_").replace(/[^\w\s]/gi, ""); - if (Number.isFinite(+groupNew.charAt(0))) {groupNew = "g" + groupNew;} - } - if (groupOld !== groupNew) { - var removed = elSelected.remove(); - if (labels.select("#"+groupNew).size() > 0) { - group = labels.select("#"+groupNew); - editFontSelect.value = fonts.indexOf(group.attr("data-font")); - editSize.value = group.attr("font-size"); - editColor.value = toHEX(group.attr("fill")); - editOpacity.value = group.attr("opacity"); - } else { - if (group.selectAll("text").size() === 0) {group.remove();} - group = labels.append("g").attr("id", groupNew); - updateGroupOptions(); - $("#editGroupSelect, #editGroupInput").toggle(); - editGroupInput.value = ""; - } - group.append(function() {return removed.node();}); - editGroupSelect.value = group.attr("id"); - } - // update Group attributes - var font = fonts[editFontSelect.value].split(':')[0].replace(/\+/g, " "); - group.attr("font-size", editSize.value) - .attr("font-family", font) - .attr("data-font", fonts[editFontSelect.value]) - .attr("fill", editColor.title) - .attr("opacity", editOpacity.value); - }); - - // Update font list for Label Editor - function updateFontOptions() { - editFontSelect.innerHTML = ""; - for (var i=0; i < fonts.length; i++) { - var opt = document.createElement('option'); - opt.value = i; - var font = fonts[i].split(':')[0].replace(/\+/g, " "); - opt.style.fontFamily = opt.innerHTML = font; - editFontSelect.add(opt); - } - } - - // convert RGB color string to HEX without # - function toHEX(rgb){ - if (rgb.charAt(0) === "#") {return rgb;} - rgb = rgb.match(/^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?/i); - return (rgb && rgb.length === 4) ? "#" + - ("0" + parseInt(rgb[1],10).toString(16)).slice(-2) + - ("0" + parseInt(rgb[2],10).toString(16)).slice(-2) + - ("0" + parseInt(rgb[3],10).toString(16)).slice(-2) : ''; - } - - // get Curve Type - function getCurveType() { - type = curveType.value; - if (type === "Catmull–Rom") {lineGen.curve(d3.curveCatmullRom);} - if (type === "Linear") {lineGen.curve(d3.curveLinear);} - if (type === "Basis") {lineGen.curve(d3.curveBasisClosed);} - if (type === "Cardinal") {lineGen.curve(d3.curveCardinal);} - if (type === "Step") {lineGen.curve(d3.curveStep);} - } - - // source from https://gist.github.com/jimhigson/7985923 - function round(path) { - return path.replace(/[\d\.-][\d\.e-]*/g, function(n) {return Math.round(n*10)/10;}) - } - - // downalod map as SVG or PNG file - function saveAsImage(type) { - console.time("saveAsImage"); - // get all used fonts - if (type === "svg") {viewbox.attr("transform", null);} - var fontsInUse = []; // to store fonts currently in use - labels.selectAll("g").each(function(d) { - var font = d3.select(this).attr("data-font"); - if (fontsInUse.indexOf(font) === -1) {fontsInUse.push(font);} - }); - var fontsToLoad = "https://fonts.googleapis.com/css?family=" + fontsInUse.join("|"); - - // clone svg - var cloneEl = document.getElementsByTagName("svg")[0].cloneNode(true); - cloneEl.id = "clone"; - document.getElementsByTagName("body")[0].appendChild(cloneEl); - var clone = d3.select("#clone"); - - // for each g element get inline style so it could be used in saved svg - var emptyG = clone.append("g").node(); - var defaultStyles = window.getComputedStyle(emptyG); - clone.selectAll("g").each(function(d) { - var compStyle = window.getComputedStyle(this); - var style = ""; - for (var i=0; i < compStyle.length; i++) { - var key = compStyle[i]; - var value = compStyle.getPropertyValue(key); - if (key !== "cursor" && value != defaultStyles.getPropertyValue(key)) { - style += key + ':' + value + ';'; - } - } - if (style != "") {this.setAttribute('style', style);} - }); - emptyG.remove(); - - // load fonts as dataURI so they will be available in downloaded svg/png - GFontToDataURI(fontsToLoad).then(cssRules => { - clone.select("defs").append("style").text(cssRules.join('\n')); - var svg_xml = (new XMLSerializer()).serializeToString(clone.node()); - var blob = new Blob([svg_xml], {type:'image/svg+xml;charset=utf-8'}); - var url = window.URL.createObjectURL(blob); - var link = document.createElement("a"); - if (type === "png") { - canvas.width = mapWidth * 2; - canvas.height = mapHeight * 2; - var img = new Image(); - img.src = url; - img.onload = function(){ - ctx.drawImage(img, 0, 0, mapWidth * 2, mapHeight * 2); - link.download = "fantasy_map_" + Date.now() + ".png"; - link.href = canvas.toDataURL('image/png'); - canvas.width = mapWidth; - canvas.height = mapHeight; - canvas.style.opacity = 0; - document.body.appendChild(link); - link.click(); - } - } else { - link.download = "fantasy_map_" + Date.now() + ".svg"; - link.href = url; - document.body.appendChild(link); - link.click(); - } - clone.remove(); - console.timeEnd("saveAsImage"); - window.setTimeout(function() {window.URL.revokeObjectURL(url);}, 2000); - }); - } - - // Code from Kaiido's answer: - // https://stackoverflow.com/questions/42402584/how-to-use-google-fonts-in-canvas-when-drawing-dom-objects-in-svg - function GFontToDataURI(url) { - "use strict;" - return fetch(url) // first fecth the embed stylesheet page - .then(resp => resp.text()) // we only need the text of it - .then(text => { - let s = document.createElement('style'); - s.innerHTML = text; - document.head.appendChild(s); - let styleSheet = Array.prototype.filter.call( - document.styleSheets, - sS => sS.ownerNode === s)[0]; - let FontRule = rule => { - let src = rule.style.getPropertyValue('src'); - let family = rule.style.getPropertyValue('font-family'); - let url = src.split('url(')[1].split(')')[0]; - return { - rule: rule, - src: src, - url: url.substring(url.length - 1, 1) - }; - }; - let fontRules = [], fontProms = []; - - for (var r of styleSheet.cssRules) { - let fR = FontRule(r) - fontRules.push(fR); - fontProms.push( - fetch(fR.url) // fetch the actual font-file (.woff) - .then(resp => resp.blob()) - .then(blob => { - return new Promise(resolve => { - let f = new FileReader(); - f.onload = e => resolve(f.result); - f.readAsDataURL(blob); - }) - }) - .then(dataURL => { - return fR.rule.cssText.replace(fR.url, dataURL); - }) - ) - } - document.head.removeChild(s); // clean up - return Promise.all(fontProms); // wait for all this has been done - }); - } - - // Save in .map format, based on FileSystem API - function saveMap() { - console.time("saveMap"); - // data convention: 0 - version; 1 - all points; 2 - cells; 3 - manors; 4 - svg; - var svg_xml = (new XMLSerializer()).serializeToString(svg.node()); - var line = "\r\n"; - var data = version + line + JSON.stringify(points) + line + JSON.stringify(cells) + line + JSON.stringify(manors) + line + svg_xml; - var dataBlob = new Blob([data], {type:"text/plain"}); - var dataURL = window.URL.createObjectURL(dataBlob); - var link = document.createElement("a"); - link.download = "fantasy_map_" + Date.now() + ".map"; - link.href = dataURL; - document.body.appendChild(link); - link.click(); - console.timeEnd("saveMap"); - window.setTimeout(function() {window.URL.revokeObjectURL(dataURL);}, 2000); - } - - // Map Loader based on FileSystem API - $("#fileToLoad").change(function() { - console.time("loadMap"); - var fileToLoad = this.files[0]; - this.value = ""; - var fileReader = new FileReader(); - fileReader.onload = function(fileLoadedEvent) { - newPoints = [], points = [], cells = [], land = [], riversData = [], island = 0, manors = [], queue = []; - var dataLoaded = fileLoadedEvent.target.result; - svg.remove(); - var data = dataLoaded.split("\r\n"); - // data convention: 0 - version; 1 - all points; 2 - cells; 3 - manors; 4 - svg; - var mapVersion = data[0]; - if (mapVersion !== version) { - var message = `The Map version does not match the Generator version (${version}). In case of issues please send the .map file to me (maxganiev@yandex.ru) for update or use an archived version of the Generator (https://github.com/Azgaar/Fantasy-Map-Generator/wiki/Changelog)`; - alertMessage.innerHTML = message; - $(function() {$("#alert").dialog({title: "Load map"});}); - } - if (mapVersion.length > 10) {console.error("Cannot load map"); return;} - points = JSON.parse(data[1]); - cells = JSON.parse(data[2]); - land = $.grep(cells, function(e) {return (e.height >= 0.2);}); - cells.map(function(e) {newPoints.push(e.data);}); - calculateVoronoi(newPoints); - manors = JSON.parse(data[3]); - document.body.insertAdjacentHTML("afterbegin", data[4]); - - // redefine variables - customization = 0, elSelected = ""; - svg = d3.select("svg").call(zoom); - mapWidth = +svg.attr("width"); - mapHeight = +svg.attr("height"); - defs = svg.select("#deftemp"); - viewbox = svg.select("#viewbox").on("touchmove mousemove", moved).on("click", clicked); - ocean = viewbox.select("#ocean"); - oceanLayers = ocean.select("#oceanLayers"); - oceanPattern = ocean.select("#oceanPattern"); - landmass = viewbox.select("#landmass"); - terrs = viewbox.select("#terrs"); - cults = viewbox.select("#cults"); - routes = viewbox.select("#routes"); - roads = routes.select("#roads"); - trails = routes.select("#trails"); - rivers = viewbox.select("#rivers"); - terrain = viewbox.select("#terrain"); - regions = viewbox.select("#regions"); - borders = viewbox.select("#borders"); - stateBorders = borders.select("#stateBorders"); - neutralBorders = borders.select("#neutralBorders"); - coastline = viewbox.select("#coastline"); - lakes = viewbox.select("#lakes"); - grid = viewbox.select("#grid"); - searoutes = routes.select("#searoutes"); - labels = viewbox.select("#labels"); - icons = viewbox.select("#icons"); - burgs = icons.select("#burgs"); - debug = viewbox.select("#debug"); - capitals = labels.select("#capitals"); - towns = labels.select("#towns"); - countries = labels.select("#countries"); - // restore events - labels.selectAll("text").on("click", editLabel); - burgs.selectAll("circle").call(d3.drag().on("drag", dragged).on("end", dragended)).on("click", changeBurg); - // restore layers state - if (cults.selectAll("path").size() == 0) {$("#toggleCultures").addClass("buttonoff");} else {$("#toggleCultures").removeClass("buttonoff");} - if (terrs.selectAll("path").size() == 0) {$("#toggleHeight").addClass("buttonoff");} else {$("#toggleHeight").removeClass("buttonoff");} - if (regions.attr("display") === "none") {$("#toggleCountries").addClass("buttonoff");} else {$("#toggleCountries").removeClass("buttonoff");} - if (rivers.attr("display") === "none") {$("#toggleRivers").addClass("buttonoff");} else {$("#toggleRivers").removeClass("buttonoff");} - if (oceanPattern.attr("display") === "none") {$("#toggleOcean").addClass("buttonoff");} else {$("#toggleOcean").removeClass("buttonoff");} - if (landmass.attr("display") === "none") {$("#landmass").addClass("buttonoff");} else {$("#landmass").removeClass("buttonoff");} - if (terrain.attr("display") === "none") {$("#toggleRelief").addClass("buttonoff");} else {$("#toggleRelief").removeClass("buttonoff");} - if (borders.attr("display") === "none") {$("#toggleBorders").addClass("buttonoff");} else {$("#toggleBorders").removeClass("buttonoff");} - if (burgs.attr("display") === "none") {$("#toggleIcons").addClass("buttonoff");} else {$("#toggleIcons").removeClass("buttonoff");} - if (labels.attr("display") === "none") {$("#toggleLabels").addClass("buttonoff");} else {$("#toggleLabels").removeClass("buttonoff");} - if (routes.attr("display") === "none") {$("#toggleRoutes").addClass("buttonoff");} else {$("#toggleRoutes").removeClass("buttonoff");} - if (grid.attr("display") === "none") {$("#toggleGrid").addClass("buttonoff");} else {$("#toggleGrid").removeClass("buttonoff");} - console.timeEnd("loadMap"); - }; - fileReader.readAsText(fileToLoad, "UTF-8"); - }); - - // Poisson-disc sampling for a points - // Source: bl.ocks.org/mbostock/99049112373e12709381; Based on https://www.jasondavies.com/poisson-disc - function poissonDiscSampler(width, height, radius) { - var k = 5, // maximum number of points before rejection - radius2 = radius * radius, - R = 3 * radius2, - cellSize = radius * Math.SQRT1_2, - gridWidth = Math.ceil(width / cellSize), - gridHeight = Math.ceil(height / cellSize), - grid = new Array(gridWidth * gridHeight), - queue = [], - queueSize = 0, - sampleSize = 0; - return function() { - if (!sampleSize) return sample(Math.random() * width, Math.random() * height); - // Pick a random existing sample and remove it from the queue - while (queueSize) { - var i = Math.random() * queueSize | 0, - s = queue[i]; - // Make a new candidate between [radius, 2 * radius] from the existing sample. - for (var j = 0; j < k; ++j) { - var a = 2 * Math.PI * Math.random(), - r = Math.sqrt(Math.random() * R + radius2), - x = s[0] + r * Math.cos(a), - y = s[1] + r * Math.sin(a); - // Reject candidates that are outside the allowed extent, or closer than 2 * radius to any existing sample - if (0 <= x && x < width && 0 <= y && y < height && far(x, y)) return sample(x, y); - } - queue[i] = queue[--queueSize]; - queue.length = queueSize; - } - }; - function far(x, y) { - var i = x / cellSize | 0, - j = y / cellSize | 0, - i0 = Math.max(i - 2, 0), - j0 = Math.max(j - 2, 0), - i1 = Math.min(i + 3, gridWidth), - j1 = Math.min(j + 3, gridHeight); - for (j = j0; j < j1; ++j) { - var o = j * gridWidth; - for (i = i0; i < i1; ++i) { - if (s = grid[o + i]) { - var s, - dx = s[0] - x, - dy = s[1] - y; - if (dx * dx + dy * dy < radius2) return false; - } - } - } - return true; - } - function sample(x, y) { - var s = [x, y]; - queue.push(s); - grid[gridWidth * (y / cellSize | 0) + (x / cellSize | 0)] = s; - ++sampleSize; - ++queueSize; - return s; - } - } - - // Hotkeys - d3.select("body").on("keydown", function() { - if (!$("#labelEditor").is(":visible")) { - switch(d3.event.keyCode) { - case 27: // Escape - break; - case 37: // Left - if (viewX + 10 <= 0) { - viewX += 10; - zoomUpdate(); - } - break; - case 39: // Right - if (viewX - 10 >= (mapWidth * (scale-1) * -1)) { - viewX -= 10; - zoomUpdate(); - } - break; - case 38: // Up - if (viewY + 10 <= 0) { - viewY += 10; - zoomUpdate(); - } - break; - case 40: // Down - if (viewY - 10 >= (mapHeight * (scale-1) * -1)) { - viewY -= 10; - zoomUpdate(); - } - break; - case 107: // Plus - if (scale < 40) { - var dx = mapWidth / 2 * (scale-1) + viewX; - var dy = mapHeight / 2 * (scale-1) + viewY; - viewX = dx - mapWidth / 2 * scale; - viewY = dy - mapHeight / 2 * scale; - scale += 1; - if (scale > 40) {scale = 40;} - zoomUpdate(); - } - break; - case 109: // Minus - if (scale > 1) { - var dx = mapWidth / 2 * (scale-1) + viewX; - var dy = mapHeight / 2 * (scale-1) + viewY; - viewX += mapWidth / 2 - dx; - viewY += mapHeight / 2 - dy; - scale -= 1; - if (scale < 1) { - scale = 1; - viewX = 0; - viewY = 0; - } - zoomUpdate(); - } - break; - } - } - }); - - // Toggle Options pane - $("#optionsTrigger").on("click", function() { - if ($("#options").css("display") === "none") { - $("#regenerate").hide(); - $("#options").fadeIn(); - $("#layoutTab").click(); - this.innerHTML = "◀"; - } else { - $("#options").fadeOut(); - this.innerHTML = "▶"; - } - }); - $("#collapsible").hover(function() { - if ($("#options").css("display") === "none") {$("#regenerate").show();} - }, function() { - $("#regenerate").hide(); - }); - - // move layers on mapLayers dragging (jquery sortable) - function moveLayer(event, ui) { - var el = getLayer(ui.item.attr("id")); - if (el) { - var prev = getLayer(ui.item.prev().attr("id")); - var next = getLayer(ui.item.next().attr("id")); - if (prev) {el.insertAfter(prev);} else if (next) {el.insertBefore(next);} - } - } - - // define connection between option layer buttons and actual svg groups - function getLayer(id) { - if (id === "toggleHeight") {return $("#terrs");} - if (id === "toggleCultures") {return $("#cults");} - if (id === "toggleRivers") {return $("#rivers");} - if (id === "toggleRelief") {return $("#terrain");} - if (id === "toggleBorders") {return $("#borders");} - if (id === "toggleCountries") {return $("#regions");} - if (id === "toggleIcons") {return $("#icons");} - if (id === "toggleLabels") {return $("#labels");} - if (id === "toggleRoutes") {return $("#routes");} - if (id === "toggleGrid") {return $("#grid");} - } - - // UI Button handlers - $("button, a, li").on("click", function() { - var id = this.id; - var parent = this.parentNode.id; - if (icons.selectAll(".tag").size() > 0) {icons.selectAll(".tag, .line").remove();} - if (id === "toggleHeight") {toggleHeight();} - if (id === "toggleCountries") { - var countries = !$("#toggleCountries").hasClass("buttonoff"); - var cultures = !$("#toggleCultures").hasClass("buttonoff"); - if (!countries && cultures) { - $("#toggleCultures").toggleClass("buttonoff"); - toggleCultures(); - } - $('#regions').fadeToggle(); - } - if (id === "toggleCultures") { - var countries = !$("#toggleCountries").hasClass("buttonoff"); - var cultures = !$("#toggleCultures").hasClass("buttonoff"); - if (!cultures && countries) { - $("#toggleCountries").toggleClass("buttonoff"); - $('#regions').fadeToggle(); - } - toggleCultures(); - } - if (id === "toggleFlux") {toggleFlux();} - if (parent === "mapLayers" || parent === "styleContent") {$(this).toggleClass("buttonoff");} - if (id === "randomMap" || id === "regenerate") { - exitCustomization(); - undraw(); - generate(); - } - if (id === "fromScratch") { - undraw(); - placePoints(); - calculateVoronoi(points); - detectNeighbors("grid"); - customizeHeightmap(); - } - if (id === "fromHeightmap") { - var heights = []; - for (var i = 0; i < points.length; i++) { - var cell = diagram.find(points[i][0], points[i][1]).index; - heights.push(cells[cell].height); - } - undraw(); - calculateVoronoi(points); - detectNeighbors("grid"); - for (var i = 0; i < points.length; i++) { - cells[i].height = heights[i]; - } - mockHeightmap(); - customizeHeightmap(); - } - // heightmap customization buttons - if (customization === 1) { - if (id === "rescale") { - $("#heightmapRescaler").dialog({ - title: "Rescale Heightmap", - minHeight: 30, width: "auto", maxWidth: 260, resizable: false, - position: {my: "right top", at: "right-10 top+10", of: "svg"}}); - - } - if (id === "rescaleMultiply") { - var modifier = rescaleModifier.value; - var subject = rescaleSubject.value; - modifyHeights(subject, 0, modifier); - mockHeightmap(); - } - if (id === "rescaleAdd") { - var modifier = rescaleModifier.value; - var subject = rescaleSubject.value; - modifyHeights(subject, +modifier, 1); - mockHeightmap(); - } - if (id === "smoothHeights") {smoothHeights(); mockHeightmap();} - if (id === "getMap") {getMap();} - if (id === "applyTemplate") { - $("#templateEditor").dialog({ - title: "Template Editor", - minHeight: 50, width: 260, resizable: false, - position: {my: "right top", at: "right-10 top+10", of: "svg"} - }); - } - if (id === "convertImage") {convertImage();} - if (id === "convertImageGrid") {$("#grid").fadeToggle();} - if (id === "convertImageHeights") {$("#landmass").fadeToggle();} - } - if ($(this).hasClass('radio')) { - if ($(this).hasClass('pressed')) { - $(".pressed").removeClass('pressed'); - viewbox.style("cursor", "default").on(".drag", null); - } else { - $(".pressed").removeClass('pressed'); - $(this).addClass('pressed'); - viewbox.style("cursor", "crosshair"); - if (id.slice(0,5) === "brush" && id !== "brushRange" && id !== "brushTrough") { - viewbox.call(drag); - } else { - viewbox.on(".drag", null); - } - } - } - if (id === "saveMap") {saveMap();} - if (id === "loadMap") {fileToLoad.click();} - if (id === "saveSVG") {saveAsImage("svg");} - if (id === "savePNG") {saveAsImage("png");} - if (id === "zoomReset") {svg.transition().duration(1000).call(zoom.transform, d3.zoomIdentity);} - if (id === "zoomPlus") { - scale += 1; - if (scale > 40) {scale = 40;} - zoomUpdate(); - } - if (id === "zoomMinus") { - scale -= 1; - if (scale <= 1) {scale = 1; viewX = 0; viewY = 0;} - zoomUpdate(); - } - if (id === "styleFontPlus" || id === "styleFontMinus") { - var el = viewbox.select("#"+styleElementSelect.value); - var mod = id === "styleFontPlus" ? 1.1 : 0.9; - el.selectAll("g").each(function() { - var el = d3.select(this); - var size = Math.trunc(+el.attr("font-size") * mod * 100) / 100; - if (size < 0.2) {size = 0.2;} - el.attr("font-size", size); - }); - return; - } - if (id === "styleFillPlus" || id === "styleFillMinus") { - var el = viewbox.select("#"+styleElementSelect.value); - var mod = id === "styleFillPlus" ? 1.1 : 0.9; - el.selectAll("*").each(function() { - var el = d3.select(this); - var size = Math.trunc(+el.attr("r") * mod * 100) / 100; - if (size < 0.1) {size = 0.1;} - if (el.node().nodeName === "circle") {el.attr("r", size);} - }); - return; - } - if (id === "styleStrokePlus" || id === "styleStrokeMinus") { - var el = viewbox.select("#"+styleElementSelect.value); - var mod = id === "styleStrokePlus" ? 1.1 : 0.9; - el.selectAll("*").each(function() { - var el = d3.select(this); - var size = Math.trunc(+el.attr("stroke-width") * mod * 100) / 100; - if (size < 0.1) {size = 0.1;} - if (el.node().nodeName === "circle") {el.attr("stroke-width", size);} - }); - return; - } - if (id === "templateClear") { - if (customization === 1) { - $("#customizationMenu").fadeIn("slow"); - viewbox.style("cursor", "crosshair").call(drag); - landmassCounter.innerHTML = "0"; - $("#landmass").empty(); - cells.map(function(i) {i.height = 0;}); - } else { - start.click(); - } - } - if (id === "templateComplete") { - if (customization === 1 && !$("#getMap").attr("disabled")) {getMap();} - } - if (id === "convertColorsMinus") { - var current = +convertColors.value - 1; - if (current < 4) {current = 3;} - convertColors.value = current; - heightsFromImage(current); - } - if (id === "convertColorsPlus") { - var current = +convertColors.value + 1; - if (current > 255) {current = 256;} - convertColors.value = current; - heightsFromImage(current); - } - if (id === "convertOverlayButton") { - $("#convertImageButtons").children().not(this).not("#imageToLoad, #convertColors").toggle(); - } - if (id === "convertAutoLum") {autoAssing("lum");} - if (id === "convertAutoHue") {autoAssing("hue");} - if (id === "convertComplete") {completeConvertion();} - }); - - // templateEditor Button handlers - $("#templateTools > button").on("click", function() { - var id = this.id; - id = id.replace("template", ""); - if (id === "Mountain") { - var steps = $("#templateBody > div").length; - if (steps > 0) {return;} - } - $("#templateBody").attr("data-changed", 1); - $("#templateBody").append('

' + id + '
'); - var el = $("#templateBody div:last-child"); - if (id === "Hill" || id === "Pit" || id === "Range" || id === "Trough") { - var count = ''; - } - if (id === "Hill") { - var dist = ''; - } - if (id === "Add" || id === "Multiply") { - var dist = ''; - } - if (id === "Add") { - var count = ''; - } - if (id === "Multiply") { - var count = ''; - } - if (id === "Strait") { - var count = ''; - } - el.append(''); - $(".icon-trash-empty").on("click", function() {$(this).parent().remove();}); - if (dist) {el.append(dist);} - if (count) {el.append(count);} - el.find("select.templateElDist").on("input", fireTemplateElDist); - $("#templateBody").attr("data-changed", 1); - }); - - // fireTemplateElDist selector handlers - function fireTemplateElDist() { - if (this.value === "interval") { - var interval = prompt("Populate a height interval (e.g. from 0.17 to 0.2), without space, but with hyphen", "0.17-0.2"); - if (interval) { - var option = ''; - $(this).append(option).val(interval); - } - } - } - - // templateSelect on change listener - $("#templateSelect").on("input", function() { - var steps = $("#templateBody > div").length; - var changed = +$("#templateBody").attr("data-changed"); - var message = "Are you sure you want to change the base tamplate? All the changes will be lost." - if (steps && changed === 1) {var proceed = confirm(message);} - if (steps === 0 || proceed === true || changed === 0) { - $("#templateBody").empty(); - var template = this.value; - $("#templateSelect").attr("data-prev", template); - addStep("Mountain"); - if (template === "templateVolcano") { - addStep("Add", 0.07); - addStep("Multiply", 1.1); - addStep("Hill", 5, 0.4); - addStep("Hill", 2, 0.15); - } - if (template === "templateHighIsland") { - addStep("Add", 0.08); - addStep("Multiply", 0.9); - addStep("Range", 4); - addStep("Hill", 12, 0.25); - addStep("Trough", 3); - addStep("Multiply", 0.75, "land"); - addStep("Hill", 3, 0.15); - } - if (template === "templateLowIsland") { - addStep("Add", 0.05); - addStep("Smooth"); - addStep("Hill", 4, 0.4); - addStep("Hill", 12, 0.2); - addStep("Trough", 3); - addStep("Multiply", 0.3, "land"); - } - if (template === "templateContinents") { - addStep("Hill", 24, 0.25); - addStep("Range", 2); - addStep("Hill", 3, 0.1); - addStep("Multiply", 0.7, "land"); - addStep("Strait", "2-8"); - addStep("Smooth"); - addStep("Pit", 5); - addStep("Trough", 3); - addStep("Multiply", 0.8, "land"); - addStep("Add", 0.02, "all"); - } - if (template === "templateArchipelago") { - addStep("Add", -0.2, "land"); - addStep("Hill", 15, 0.15); - addStep("Trough", 2); - addStep("Pit", 8); - addStep("Add", -0.05, "land"); - addStep("Multiply", 0.9, "land"); - } - if (template === "templateAtoll") { - addStep("Hill", 2, 0.35); - addStep("Range", 1); - addStep("Add", 0.07, "all"); - addStep("Smooth"); - addStep("Multiply", 0.1, "0.27-10"); - } - $("#templateBody").attr("data-changed", 0); - } else { - var prev = $("#templateSelect").attr("data-prev"); - $("#templateSelect").val(prev); - } - }); - - // interprete template function - function addStep(feature, count, dist) { - if (!feature) {return;} - if (feature === "Mountain") {templateMountain.click();} - if (feature === "Hill") {templateHill.click();} - if (feature === "Pit") {templatePit.click();} - if (feature === "Range") {templateRange.click();} - if (feature === "Trough") {templateTrough.click();} - if (feature === "Strait") {templateStrait.click();} - if (feature === "Add") {templateAdd.click();} - if (feature === "Multiply") {templateMultiply.click();} - if (feature === "Smooth") {templateSmooth.click();} - if (count) {$("#templateBody div:last-child .templateElCount").val(count);} - if (dist) { - if (dist !== "land") { - var option = ''; - $("#templateBody div:last-child .templateElDist").append(option); - } - $("#templateBody div:last-child .templateElDist").val(dist); - } - } - - // Execute custom template - $("#templateRun").on("click", function() { - if (customization !== 1) {return;} - var steps = $("#templateBody > div").length; - if (steps) {cells.map(function(i) {i.height = 0;});} - for (var step=1; step <= steps; step++) { - var element = $("#templateBody div:nth-child(" + step + ")"); - var type = element.attr("data-type"); - if (type === "Mountain") {addMountain(); continue;} - var count = $("#templateBody div:nth-child(" + step + ") .templateElCount").val(); - var dist = $("#templateBody div:nth-child(" + step + ") .templateElDist").val(); - if (count) { - if (count[0] !== "-" && count.includes("-")) { - var lim = count.split("-"); - count = Math.floor(Math.random() * (+lim[1] - +lim[0] + 1) + +lim[0]); - } else { - count = +count; // parse string - } - } - if (type === "Hill") {addHill(count, +dist);} - if (type === "Pit") {addPit(count);} - if (type === "Range") {addRange(count);} - if (type === "Trough") {addRange(-1 * count);} - if (type === "Strait") {addStrait(count);} - if (type === "Add") {modifyHeights(dist, count, 1);} - if (type === "Multiply") {modifyHeights(dist, 0, count);} - if (type === "Smooth") {smoothHeights();} - } - if (steps) {mockHeightmap();} - }); - - // Save custom template as text file - $("#templateSave").on("click", function() { - var steps = $("#templateBody > div").length; - var stepsData = ""; - for (var step=1; step <= steps; step++) { - var element = $("#templateBody div:nth-child(" + step + ")"); - var type = element.attr("data-type"); - var count = $("#templateBody div:nth-child(" + step + ") .templateElCount").val(); - var dist = $("#templateBody div:nth-child(" + step + ") .templateElDist").val(); - if (!count) {count = "0";} - if (!dist) {dist = "0";} - stepsData += type + " " + count + " " + dist + "\r\n"; - } - var dataBlob = new Blob([stepsData], {type:"text/plain"}); - var url = window.URL.createObjectURL(dataBlob); - var link = document.createElement("a"); - link.download = "template_" + Date.now() + ".txt"; - link.href = url; - link.click(); - $("#templateBody").attr("data-changed", 0); - }); - - // Load custom template as text file - $("#templateLoad").on("click", function() {templateToLoad.click();}); - $("#templateToLoad").change(function() { - var fileToLoad = this.files[0]; - this.value = ""; - var fileReader = new FileReader(); - fileReader.onload = function(fileLoadedEvent) { - var dataLoaded = fileLoadedEvent.target.result; - var data = dataLoaded.split("\r\n"); - $("#templateBody").empty(); - if (data.length > 0) { - $("#templateBody").attr("data-changed", 1); - $("#templateSelect").attr("data-prev", "templateCustom").val("templateCustom"); - } - for (var i=0; i < data.length; i++) { - var line = data[i].split(" "); - addStep(line[0], line[1], line[2]); - } - }; - fileReader.readAsText(fileToLoad, "UTF-8"); - }); - - // Image to Heightmap Converter dialog - function convertImage() { - $(".pressed").removeClass('pressed'); - viewbox.style("cursor", "default").on(".drag", null); - var div = d3.select("#colorScheme"); - if (div.selectAll("*").size() === 0) { - for (var i = 0; i <= 100; i++) { - var width = i < 20 || i > 70 ? "1px" : "3px"; - if (i === 0) {width = "4px";} - var clr = color(1-i/100); - var style = "background-color: " + clr + "; width: " + width; - div.append("div").attr("data-color", i/100).attr("style", style); - } - div.selectAll("*").on("touchmove mousemove", showHeight).on("click", assignHeight); - } - $("#imageConverter").dialog({ - title: "Image to Heightmap Converter", - minHeight: 30, width: 260, resizable: false, - position: {my: "right top", at: "right-10 top+10", of: "svg"}}) - .on('dialogclose', function() {completeConvertion();}); - } - - // Load image to convert - $("#convertImageLoad").on("click", function() {imageToLoad.click();}); - $("#imageToLoad").change(function() { - console.time("loadImage"); - // reset style - viewbox.attr("transform", null); - grid.attr("display", "block").attr("stroke-width", .3); - // load image - var file = this.files[0]; - this.value = ""; // reset input value to get triggered if the same file is uploaded - var reader = new FileReader(); - var img = new Image; - // draw image - img.onload = function() { - ctx.drawImage(img, 0, 0, mapWidth, mapHeight); - heightsFromImage(+convertColors.value); - console.timeEnd("loadImage"); - } - reader.onloadend = function() {img.src = reader.result;} - reader.readAsDataURL(file); - }); - - function heightsFromImage(count) { - var imageData = ctx.getImageData(0, 0, mapWidth, mapHeight); - var data = imageData.data; - $("#landmass > path, .color-div").remove(); - $("#landmass, #colorsUnassigned").fadeIn(); - $("#colorsAssigned").fadeOut(); - var colors = [], palette = []; - points.map(function(i) { - var x = i[0], y = i[1]; - if (y == mapHeight) {y--;} - if (x == mapWidth) {x--;} - var p = (x + y * mapWidth) * 4; - var r = data[p], g = data[p + 1], b = data[p + 2]; - colors.push([r, g, b]); - }); - var cmap = MMCQ.quantize(colors, count); - polygons.map(function(i, d) { - cells[d].height = undefined; - var nearest = cmap.nearest(colors[d]); - var rgb = "rgb(" + nearest[0] + ", " + nearest[1] + ", " + nearest[2] + ")"; - var hex = toHEX(rgb); - if (palette.indexOf(hex) === -1) {palette.push(hex);} - landmass.append("path").attr("d", "M" + i.join("L") + "Z").attr("data-i", d).attr("fill", hex).attr("stroke", hex); - }); - landmass.selectAll("path").on("click", landmassClicked); - palette.sort(function(a, b) {return d3.lab(a).b - d3.lab(b).b;}).map(function(i) { - $("#colorsUnassigned").append('
'); - }); - $(".color-div").click(selectColor); - } - - function landmassClicked() { - var color = d3.select(this).attr("fill"); - $("#"+color.slice(1)).click(); - } - - function selectColor() { - landmass.selectAll(".selectedCell").classed("selectedCell", 0); - var el = d3.select(this); - if (el.classed("selectedColor")) { - el.classed("selectedColor", 0); - } else { - $(".selectedColor").removeClass("selectedColor"); - el.classed("selectedColor", 1); - $("#colorScheme .hoveredColor").removeClass("hoveredColor"); - $("#colorsSelectValue").text(0); - if (el.attr("data-height")) { - var height = el.attr("data-height"); - $("#colorScheme div[data-color='" + height + "']").addClass("hoveredColor"); - $("#colorsSelectValue").text(Math.round(height * 100)); - } - var color = "#" + d3.select(this).attr("id"); - landmass.selectAll("path").classed("selectedCell", 0); - landmass.selectAll("path[fill='" + color + "']").classed("selectedCell", 1); - } - } - - function showHeight() { - var el = d3.select(this); - var height = Math.round(el.attr("data-color") * 100); - $("#colorsSelectValue").text(height); - $("#colorScheme .hoveredColor").removeClass("hoveredColor"); - el.classed("hoveredColor", 1); - } - - function assignHeight() { - var sel = $(".selectedColor")[0]; - var height = +d3.select(this).attr("data-color"); - var rgb = color(1-height); - var hex = toHEX(rgb); - sel.style.backgroundColor = rgb; - sel.setAttribute("data-height", height); - var cur = "#" + sel.id; - sel.id = hex.substr(1); - landmass.selectAll(".selectedCell").each(function() { - d3.select(this).attr("fill", hex).attr("stroke", hex); - var i = +d3.select(this).attr("data-i"); - cells[i].height = height; - }); - var parent = sel.parentNode; - if (parent.id === "colorsUnassigned") { - colorsAssigned.appendChild(sel); - $("#colorsAssigned").fadeIn(); - if ($("#colorsUnassigned .color-div").length < 1) {$("#colorsUnassigned").fadeOut();} - } - if ($("#colorsAssigned .color-div").length > 1) {sortAssignedColors();} - } - - // sort colors based on assigned height - function sortAssignedColors() { - var data = []; - var colors = d3.select("#colorsAssigned").selectAll(".color-div"); - colors.each(function(d) { - var id = d3.select(this).attr("id"); - var height = +d3.select(this).attr("data-height"); - data.push({id, height}); - }); - data.sort(function(a, b) {return a.height - b.height}).map(function(i) { - $("#colorsAssigned").append($("#"+i.id)); - }); - } - - // auto assign color based on luminosity or hue - function autoAssing(type) { - var imageData = ctx.getImageData(0, 0, mapWidth, mapHeight); - var data = imageData.data; - $("#landmass > path, .color-div").remove(); - $("#colorsAssigned").fadeIn(); - $("#colorsUnassigned").fadeOut(); - var heights = []; - polygons.map(function(i, d) { - var x = i.data[0], y = i.data[1]; - if (y == mapHeight) {y--;} - var p = (x + y * mapWidth) * 4; - var r = data[p], g = data[p + 1], b = data[p + 2]; - var lab = d3.lab("rgb(" + r + ", " + g + ", " + b + ")"); - if (type === "hue") { - var normalized = Math.trunc(normalize(lab.b + lab.a / 2, -50, 200) * 100) / 100; - } else { - var normalized = Math.trunc(normalize(lab.l, 0, 100) * 100) / 100; - } - heights.push(normalized); - var rgb = color(1 - normalized); - var hex = toHEX(rgb); - cells[d].height = normalized; - landmass.append("path").attr("d", "M" + i.join("L") + "Z").attr("data-i", d).attr("fill", hex).attr("stroke", hex); - }); - heights.sort(function(a, b) {return a - b;}); - var unique = [...new Set(heights)]; - unique.map(function(i) { - var rgb = color(1 - i); - var hex = toHEX(rgb); - $("#colorsAssigned").append('
'); - }); - $(".color-div").click(selectColor); - } - - function normalize(val, min, max) { - var normalized = (val - min) / (max - min); - if (normalized < 0) {normalized = 0;} - if (normalized > 1) {normalized = 1;} - return normalized; - } - - function completeConvertion() { - mockHeightmap(); - canvas.style.opacity = convertOverlay.value = convertOverlayValue.innerHTML = 0; - $("#imageConverter").dialog('close'); - } - - // Clear the map - function undraw() { - svg.selectAll("path, circle, text").remove(); - cells = [], land = [], riversData = [], island = 0, manors = [], queue = []; - } - - // Enter Heightmap Customization mode - function customizeHeightmap() { - customization = 1; - svg.transition().duration(1000).call(zoom.transform, d3.zoomIdentity); - $("#customizationMenu").fadeIn("slow"); - viewbox.style("cursor", "crosshair").call(drag); - landmassCounter.innerHTML = "0"; - $('#grid').fadeIn(); - $('#toggleGrid').removeClass("buttonoff"); - if ($("#labelEditor").is(":visible")) {$("#labelEditor").dialog('close');} - if ($("#riverEditor").is(":visible")) {$("#riverEditor").dialog('close');} - } - - // Remove all customization related styles, reset values - function exitCustomization() { - customization = 0; - canvas.style.opacity = 0; - $("#customizationMenu").fadeOut("slow"); - $("#getMap").attr("disabled", true).addClass("buttonoff"); - $('#grid').empty().fadeOut(); - $('#toggleGrid').addClass("buttonoff"); - viewbox.style("cursor", "default").on(".drag", null); - if (!$("#toggleHeight").hasClass("buttonoff")) {toggleHeight();} - if ($("#imageConverter").is(":visible")) {$("#imageConverter").dialog('close');} - if ($("#templateEditor").is(":visible")) {$("#templateEditor").dialog('close');} - } - - // Options handlers - $("input, select").on("input change", function() { - var id = this.id; - if (id === "styleElementSelect") { - var sel = this.value; - var el = viewbox.select("#"+sel); - $("#styleInputs div").hide(); - if (sel === "rivers" || sel === "oceanBase" || sel === "lakes" || sel === "landmass" || sel === "burgs") { - $("#styleFill").css("display", "inline-block"); - styleFillInput.value = styleFillOutput.value = el.attr("fill"); - } - if (sel === "roads" || sel === "trails" || sel === "searoutes" || sel === "lakes" || sel === "stateBorders" || sel === "neutralBorders" || sel === "grid" || sel === "coastline") { - $("#styleStroke").css("display", "inline-block"); - styleStrokeInput.value = styleStrokeOutput.value = el.attr("stroke"); - $("#styleStrokeWidth").css("display", "block"); - var width = el.attr("stroke-width") || ""; - styleStrokeWidthInput.value = styleStrokeWidthOutput.value = width; - } - if (sel === "roads" || sel === "trails" || sel === "searoutes" || sel === "stateBorders" || sel === "neutralBorders") { - $("#styleStrokeDasharray, #styleStrokeLinecap").css("display", "block"); - styleStrokeDasharrayInput.value = el.attr("stroke-dasharray") || ""; - styleStrokeLinecapInput.value = el.attr("stroke-linecap") || "inherit"; - } - if (sel === "regions") { - $("#styleMultiple").css("display", "inline-block"); - $("#styleMultiple input").remove(); - for (var r = 0; r < capitalsCount; r++) { - var color = regions.select(".region"+r).attr("fill"); - $("#styleMultiple").append(''); - } - $("#styleMultiple input").on("input", function() { - var id = this.id; - var r = +id.replace("regionColor", ""); - regions.selectAll(".region"+r).attr("fill", this.value); - }); - } - if (sel === "terrs") {$("#styleScheme").css("display", "block");} - if (sel === "heightmap") {$("#styleScheme").css("display", "block");} - if (sel === "cults") { - $("#styleMultiple").css("display", "inline-block"); - $("#styleMultiple input").remove(); - var colors = []; - cults.selectAll("path").each(function(d) { - var fill = d3.select(this).attr("fill"); - if (colors.indexOf(fill) === -1) {colors.push(fill);} - }); - for (var c = 0; c < colors.length; c++) { - $("#styleMultiple").append(''); - } - $("#styleMultiple input").on("input", function() { - var oldColor = "#" + d3.select(this).attr("id"); - var newColor = this.value; - cults.selectAll("path").each(function() { - var fill = d3.select(this).attr("fill"); - if (oldColor === fill) {d3.select(this).attr("fill", newColor).attr("stroke", newColor);} - }); - $(this).attr("id", newColor.substr(1)); - }); - } - if (sel === "labels") { - $("#styleFill, #styleFontSize").css("display", "inline-block"); - styleFillInput.value = styleFillOutput.value = el.select("g").attr("fill"); - } - if (sel === "burgs") { - $("#styleSize").css("display", "block"); - $("#styleStroke").css("display", "inline-block"); - styleStrokeInput.value = styleStrokeOutput.value = el.attr("stroke"); - } - // opacity - $("#styleOpacity, #styleFilter").css("display", "block"); - var opacity = el.attr("opacity") || 1; - styleOpacityInput.value = styleOpacityOutput.value = opacity; - // filter - if (sel == "oceanBase") {el = oceanLayers;} - styleFilterInput.value = el.attr("filter") || ""; - return; - } - if (id === "styleFillInput") { - styleFillOutput.value = this.value; - var el = viewbox.select("#"+styleElementSelect.value); - if (styleElementSelect.value !== "labels") { - el.attr('fill', this.value); - } else { - el.selectAll("g").attr('fill', this.value); - } - return; - } - if (id === "styleStrokeInput") { - styleStrokeOutput.value = this.value; - var el = viewbox.select("#"+styleElementSelect.value); - el.attr('stroke', this.value); - return; - } - if (id === "styleStrokeWidthInput") { - styleStrokeWidthOutput.value = this.value; - var sel = styleElementSelect.value; - viewbox.select("#"+sel).attr('stroke-width', +this.value); - return; - } - if (id === "styleStrokeDasharrayInput") { - var sel = styleElementSelect.value; - viewbox.select("#"+sel).attr('stroke-dasharray', this.value); - return; - } - if (id === "styleStrokeLinecapInput") { - var sel = styleElementSelect.value; - viewbox.select("#"+sel).attr('stroke-linecap', this.value); - return; - } - if (id === "styleOpacityInput") { - styleOpacityOutput.value = this.value; - var sel = styleElementSelect.value; - viewbox.select("#"+sel).attr('opacity', this.value); - return; - } - if (id === "styleFilterInput") { - var sel = styleElementSelect.value; - if (sel == "oceanBase") {sel = "oceanLayers";} - var el = viewbox.select("#"+sel); - el.attr('filter', this.value); - return; - } - if (id === "styleSchemeInput") { - terrs.selectAll("path").remove(); - toggleHeight(); - return; - } - if (id === "sizeInput") {graphSize = sizeOutput.value = this.value;} - if (id === "manorsInput") {manorsCount = manorsOutput.value = this.value;} - if (id === "regionsInput") { - capitalsCount = regionsOutput.value = this.value; - var size = Math.round(6 - capitalsCount / 20); - if (size < 3) {size = 3;} - capitals.attr("font-size", size); - size = Math.round(18 - capitalsCount / 6); - if (size < 4) {size = 4;} - countries.attr("font-size", size); - } - if (id === "powerInput") {power = powerOutput.value = this.value;} - if (id === "neutralInput") { - neutral = neutralOutput.value = this.value; - if (this.value === "100") {neutral = "500";} - } - if (id === "swampinessInput") {swampiness = swampinessOutput.value = this.value;} - if (id === "sharpnessInput") {sharpness = sharpnessOutput.value = this.value;} - if (id === "brushPower") {brushPowerOutput.value = this.value;} - if (id === "convertOverlay") {canvas.style.opacity = convertOverlayValue.innerHTML = +this.value;} - }); - - $("#layoutPreset").on("change", function() { - var preset = this.value; - $("#mapLayers li").not("#toggleOcean, #toggleLandmass").addClass("buttonoff"); - $("#toggleOcean, #toggleLandmass").removeClass("buttonoff"); - $("#oceanPattern, #landmass").fadeIn(); - $("#rivers, #terrain, #borders, #regions, #burgs, #labels, #routes, #grid").fadeOut(); - cults.selectAll("path").remove(); - terrs.selectAll("path").remove(); - if (preset === "layoutPolitical") { - toggleRivers.click(); - toggleRelief.click(); - toggleBorders.click(); - toggleCountries.click(); - toggleIcons.click(); - toggleLabels.click(); - toggleRoutes.click(); - } - if (preset === "layoutCultural") { - toggleRivers.click(); - toggleRelief.click(); - toggleBorders.click(); - $("#toggleCultures").click(); - toggleIcons.click(); - toggleLabels.click(); - } - if (preset === "layoutEconomical") { - toggleRivers.click(); - toggleRelief.click(); - toggleBorders.click(); - toggleIcons.click(); - toggleLabels.click(); - toggleRoutes.click(); - } - if (preset === "layoutHeightmap") { - $("#toggleHeight").click(); - toggleRivers.click(); - } - }); - - // UI Button handlers - $(".tab > button").on("click", function() { - $(".tabcontent").hide(); - $(".tab > button").removeClass("active"); - $(this).addClass("active"); - var id = this.id; - if (id === "layoutTab") {$("#layoutContent").show();} - if (id === "styleTab") {$("#styleContent").show();} - if (id === "optionsTab") {$("#optionsContent").show();} - if (id === "customizeTab") {$("#customizeContent").show();} - }); -} \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 94a9ed02..00000000 --- a/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/README.md b/README.md index 9ad4b67d..68795972 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,15 @@ -# Fantasy Map Generator +Azgaar's _Fantasy Map Generator_ demo, v. 0.54b. Based on [D3](https://d3js.org/) Voronoi diagram rendered to svg. -Azgaar's _Fantasy Map Generator_. Based on [D3](https://d3js.org) Voronoi diagram rendered in svg. +Project goal is a procedurally generated map for my *Medieval Dynasty* simulator. Map should be interactive, scalable, fast and plausible. There should be enought space to place at least 500 manors within 7 regions. The imagined area is about 200.000 km2. -Project goal is a procedurally generated map for my *Medieval Dynasty* simulator. Map should be interactive, scalable, fast and plausible. There should be enough space to place at least 500 burgs within 7 countries. The imagined land area is about 1 million km2. +Click on the arrow to open the Options. Click on *New map* to genarate a random map based on options setup. Check out [the project wiki](https://github.com/Azgaar/Fantasy-Map-Generator/wiki) for guidance. -[![alt tag](https://i0.wp.com/azgaar.files.wordpress.com/2017/03/80k-part.png)](https://azgaar.wordpress.com) - -Project is under development, check out the demo [here](https://azgaar.github.io/Fantasy-Map-Generator). Please refer to [the project wiki](https://github.com/Azgaar/Fantasy-Map-Generator/wiki) for guidance. Links to an older versions are listed in the [changelog](https://github.com/Azgaar/Fantasy-Map-Generator/wiki/Changelog). - -Some details are covered in my blog [_Fantasy Maps for fun and glory_](https://azgaar.wordpress.com), you may also keep an eye on my [devboard](https://trello.com/b/7x832DG4/fantasy-map-generator). Comments and ideas are *highly* welcomed, kindly contact me via [email](mailto:maxganiev@yandex.ru). I would also like to see your completed or work in progress maps. For bug reports and change requests please use the project [issues page](https://github.com/Azgaar/Fantasy-Map-Generator/issues). +This is a demo version, some new cool features are developed, but not yet deployed. Details are covered in my blog [Fantasy Maps for fun and glory](https://azgaar.wordpress.com), development board is [here](https://trello.com/b/7x832DG4/fantasy-map-generator). Comments and ideas are *highly* welcomed, kindly contact me [via email](mailto:maxganiev@yandex.ru). I would also like to see your completed or work in progress maps. For bug reports and change requests please use the main project [issues page](https://github.com/Azgaar/Fantasy-Map-Generator/issues). _Inspiration:_ -* Martin O'Leary's [_Generating fantasy maps_](https://mewo2.com/notes/terrain) +* 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) +* 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) +* Scott Turner's [_Here Dragons Abound_](https://heredragonsabound.blogspot.com) \ No newline at end of file diff --git a/WIP version/index.css b/WIP version/index.css deleted file mode 100644 index 5e737fd3..00000000 --- a/WIP version/index.css +++ /dev/null @@ -1,349 +0,0 @@ -@import url('https://fonts.googleapis.com/css?family=Bitter:400,400i&subset=latin-ext'); -body { - user-select: none; -} - -svg { - position: absolute; - background-color: #5167a9; - border: 1px solid #414345; -} - -canvas { - position: absolute; - pointer-events: none; -} - -.base { - stroke: none; - fill: #5167a9; -} - -.ocean { - filter: url(#blurFilter); -} - -.mottling { - fill: url(#mottling); - opacity: .1; -} - -input { - width: 100px; - height: 8px; -} - -input[type=checkbox] { - width: 8px; - height: 14px; - margin-right: 0px; -} - -.cursor { - fill: none; -} - -.mapCells { - stroke-width: 0.1; - shape-rendering: optimizeSpeed; - mask: url(#shape); -} - -.mapContours { - stroke-width: 0.1; - shape-rendering: optimizeSpeed; - mask: url(#shape); -} - -.hillHatch { - fill: none; - stroke: grey; - stroke-width: 1; - stroke-dasharray: 0.1, 0.5; -} - -.grid { - stroke: grey; - stroke-width: 0.1; - fill: #5167a9; - fill-opacity: 0; -} - -.hCells { - stroke-width: .7; - stroke: none; - } - -.flux { - stroke-width: 0.1; - opacity: 0.7; -} - -.islandBack { - stroke: none; -} - -.lakecoast { - fill: #95cff3; - stroke: #477794; - stroke-width: 0.2; - stroke-linejoin: round; -} - -.coastShade { - opacity: 0.5; - filter: url(#blurFilter); -} - -.coastline { - fill: none; - stroke: #1f3846; - stroke-width: 1; - stroke-linejoin: round; -} - -#shape { - fill: white; -} - -.shallow { - fill: url(#shallowHatch); - mask: url(#shape); -} - -.coastOutline { - fill: none; -} - -.rivers { - fill: none; - stroke: #5d97bb; - stroke-linecap: round; - mask: url(#shape); -} - -.riversShade { - fill: none; - stroke: black; - opacity: 0.9; - filter: url(#blurFilter); -} - -.hatching { - fill: none; - stroke: grey; - stroke-width: 0.1; -} - -.debug { - display: block; -} - -#initial { - display: none; - font-family: Georgia; - position: absolute; - cursor: default; - color: #fff5da; - top: 8%; - left: 5%; -} - -.buttonBig { - font-family: vedrana; - border-radius: 5px; - text-shadow: 1px 0px 1px #FF5722; - color: #ffffff; - font-size: 24px; - padding: 10px 15px 8px 22px; -} - -.buttonBig:hover { - background: rgba(110,140,200,0.4); - cursor: pointer; -} - -.buttonBig:active { - transform: translateY(1px); -} - -.buttonBig span { - display: none; - text-shadow: none; - color: #364162; - margin-right: 14px; - float: right; -} - -.buttonBig:hover span { - display: inline; -} - -.title { - text-shadow: 0px 1px 4px #4c3a35; -} - -#title_name { - font-size: 40px; - margin-left: 50px; -} - -#title { - font-size: 75px; - margin-top: -12px; -} - -#version { - text-align: right; - margin: -5px 14px 14px 0; - font-size: 24px; -} - -.step { - font-family: Georgia; - text-shadow: 0px 2px 8px #4c3a35; - fill: #fff5da; - font-size: 5px; - fill-opacity: .1; - cursor: default; -} - -#toolbar { - display: none; - position: absolute; - font-size: 18px; - width: 27px; - top: 187px; - border: 1px solid #39464e; - border-left: 0; - border-radius: 0 4px 4px 0; - background: linear-gradient(#c2b6b6, #b5bbc2, #7A7A7A); -} - -.button { - cursor: pointer; -} - -.toolbar_button { - position: relative; - text-shadow: 1px 0px 2px #222c36; - color: #cfd6d9; - margin: 0 -8px 0 4px; -} - -.selected { - stroke: black; - stroke-width: 0.6; - fill: none; - stroke-linejoin: round; -} - -.highlighted { - stroke: gray; - stroke-width: 0.4; - fill: none; - stroke-linejoin: round; -} - -.cursored { - fill: none; - stroke-linejoin: round; - } - -#cellMenu { - display: none; - position: absolute; - border: 1px solid #39464e; - border-radius: 4px; - background: linear-gradient(#c2b6b6, #b5bbc2, #7A7A7A); - height: 22px; -} - -.cellMenu_button { - position: relative; - display: inline-flex; - text-shadow: 1px 0px 5px #222c36; - color: #cfd6d9; - padding: 1px 4px; - top: 0px; - left: 0px; -} - -.toolbar_button:hover, .cellMenu_button:hover { - text-shadow: 1px 0px 3px black; - color: #ffffff; - cursor: pointer; -} - -.toolbar_button:active, .cellMenu_button:active { - top: 1px; -} - -.smaller { - font-size: smaller; -} - -#back { - margin-right: -11px; -} - -.inline { - display: inline-block; -} - -#hintbar { - position: absolute; - text-align: center; - top: 520px; - width: 960px; - cursor: default; - text-shadow: 1px 0px 1px #1d0e0f; - color: #ffffff; - font-size: 17px; - pointer-events: none; -} - -.toolbarSection { - display: none; - position: absolute; - margin: -1px 0 0 27px; - border: 1px solid #39464e; - border-left: 0; - border-radius: 0 4px 4px 0; - background: linear-gradient(150deg, #bfb7b9, #b5bbc2, #7A7A7A); -} - -.toolbarSection > div { - margin: 0 -4px 0 5px; -} - -#toolbar_step2 { - display: none; -} - -.cloud { - cursor: pointer; - display: none; - font-size: 50px; - fill: #fcfcfd; - stroke: #39464e; - stroke-width: 2px; - text-anchor: middle; -} - -#cloudArrow { - font-size: 16px; - fill: #39464e; - stroke-width: 0.5; -} - -.wind { - fill: white; -} - -#operative { - position: absolute; - border: 1px solid #414345; - left: 974px; - top: 8px; -} \ No newline at end of file diff --git a/WIP version/index.html b/WIP version/index.html deleted file mode 100644 index 1bd9a055..00000000 --- a/WIP version/index.html +++ /dev/null @@ -1,238 +0,0 @@ - - - - Azgaar's Fantasy Map Generator (WIP) - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- Color:
- Angle modifier: - 15
- Alignment:
- Separation:
- Persistence:
-
- - \ No newline at end of file diff --git a/WIP version/script.js b/WIP version/script.js deleted file mode 100644 index cd6ec22b..00000000 --- a/WIP version/script.js +++ /dev/null @@ -1,2639 +0,0 @@ -// Fantasy Map Generator (WIP) main script -fantasyMapGenerator(); -function fantasyMapGenerator() { - console.clear(); - console.time(" TimeTotal"); - $(".container").hide(); - - // Define variables - var svg = d3.select("svg"), - mapWidth = +svg.attr("width"), - mapHeight = +svg.attr("height"), - defs = svg.select("#deftemp"), - viewbox = svg.select(".viewbox").on("touchmove mousemove", moved).on("click", clicked), - container = viewbox.select(".container"), //.attr("transform", "translate(80 25)"), - ocean = container.append("g").attr("class", "ocean"), - rose = container.append("use").attr("xlink:href","#rose"), - islandBack = container.append("g").attr("class", "islandBack"), - hCells = container.append("g").attr("class", "hCells"), - grid = container.append("g").attr("class", "grid"), - mapCells = container.append("g").attr("class", "mapCells"), - mapContours = container.append("g").attr("class", "mapContours"), - hatching = container.append("g").attr("class", "hatching"), - rivers = container.append("g").attr("class", "rivers"), - riversShade = rivers.append("g").attr("class", "riversShade"), - coasts = container.append("g").attr("class", "coasts"), - coastline = coasts.append("g").attr("class", "coastline"), - lakecoast = coasts.append("g").attr("class", "lakecoast"), - debug = container.append("g").attr("class", "debug"), - selected = debug.append("g").attr("class", "selected"), - highlighted = debug.append("g").attr("class", "highlighted") - cursored = debug.append("g").attr("class", "cursored"); - - var base = ocean.append("rect").attr("x", 0).attr("y", 0).attr("width", mapWidth).attr("height", mapHeight).attr("class", "base"); - var mottling = container.append("rect").attr("x", 0).attr("y", 0).attr("width", mapWidth).attr("height", mapHeight).attr("class", "mottling"); - - // Define basic data for Voronoi. Poisson-disc sampling for a points - // Source: bl.ocks.org/mbostock/99049112373e12709381 - console.time('poissonDiscSampler'); - var voronoi = d3.voronoi().extent([[0, 0], [mapWidth, mapHeight]]); - var diagram, polygons; - var sampler = poissonDiscSampler(mapWidth, mapHeight, 5.9); - var samples = [], sample; - while (sample = sampler()) {samples.push([Math.ceil(sample[0]), Math.ceil(sample[1])]);} - console.timeEnd('poissonDiscSampler'); - - // Add D3 drag and zoom behavior - var zoom = d3.zoom() - .translateExtent([[0, 0], [mapWidth, mapHeight]]) - .scaleExtent([1, 40]); // 40x is default max zoom; - svg.call(zoom); - - var drag = d3.drag() - .container(function() {return this;}) - .subject(function() {var p=[d3.event.x, d3.event.y]; return [p, p];}) - .on("start", dragstarted); - - function zoomed() { - scale = d3.event.transform.k; - viewX = d3.event.transform.x; - viewY = d3.event.transform.y; - if (mapStyle.value == "map_contours" && mapType.value == "heightmap") { - var x = 0.5 / scale; - var y = 0.6 / scale; - container.selectAll(".contoursShade") - .attr("transform", "translate("+x+" "+y+")") - .attr("opacity", 4 / scale); - mapContours.attr("opacity", 4 / scale); - } - viewbox.attr("transform", d3.event.transform); - } - - // manually update viewbox - function zoomUpdate() { - var transform = d3.zoomIdentity.translate(viewX, viewY).scale(scale); - svg.call(zoom.transform, transform); - } - - var dragCloud = d3.drag() - .container(function() {return this;}) - .subject(function() {var p=[d3.event.x, d3.event.y]; return [p, p];}) - .on("start", dragCloudstarted); - - cloud = debug.append("g").attr("class", "cloud").call(dragCloud); - cloud.append("text").text("☁").attr("x", 96).attr("y", mapHeight*0.5); - cloud.append("text").text("⇶").attr("x", 96).attr("y", mapHeight*0.5) - .attr("dx", "2").attr("dy", "-17").attr("id", "cloudArrow"); - - // Common variables - var queue = [], riversData = [], selection = [], highlighting = [], - scale = 1, viewX = 0, viewY = 0, simplex, - noiseApplied, pointsHeights = [], pointsCells = [], pointsBiomes = [], pointsCellHeights = [], - biomNames = [], biomColors = [], biomIDs = "", biomGrad = "", adjectives = [], - mapTemplate = "Undefined", boids = [], animation, animated = false, - // D3 colors - bright = d3.scaleSequential(d3.interpolateSpectral), // 1- - light = d3.scaleSequential(d3.interpolateRdYlGn), // 1.2- - green = d3.scaleSequential(d3.interpolateGreens), // 0 - blue = d3.scaleSequential(d3.interpolateBlues), // 0 - monochrome = d3.scaleSequential(d3.interpolateGreys), // 0.8- - sepia = d3.scaleLinear().domain([0, 1]).interpolate(d3.interpolateHcl).range([d3.rgb("#8e5e2a"), d3.rgb("#faf6ea")]), - // Journey data - journeyStep = -1, - stepName = ["", "1. Define Landmass", "2. Finalize Heighmap", "3. Define Climate"], - stepHint = ["", "Select a mode and mock up the Heighmap", "Fine-tune the Heighmap and overlay with noise", "Define precipitation and set up Biomes",]; - - // D3 Line generator - var scX = d3.scaleLinear().domain([0, mapWidth]).range([0, mapWidth]); - var scY = d3.scaleLinear().domain([0, mapHeight]).range([0, mapHeight]); - var lineGen = d3.line().x(function(d) {return scX(d.scX);}).y(function(d) {return scY(d.scY);}); - - // Prepare voronoi graph on-load - loadData(); - newRandomMap(); - $("#initial, .container").fadeIn("slow"); - console.timeEnd(" TimeTotal"); - - // Assing long strings and arrays (will be a separate json file) - function loadData() { - adjectives = ["Ablaze", "Ablazing", "Accented", "Ashen", "Ashy", "Beaming", "Bi-Color", "Blazing", "Bleached", "Bleak", "Blended", "Blotchy", "Bold", "Brash", "Bright", "Brilliant", "Burnt", "Checkered", "Chromatic", "Classic", "Clean", "Colored", "Colorful", "Colorless", "Complementing", "Contrasting", "Cool", "Coordinating", "Crisp", "Dappled", "Dark", "Dayglo", "Deep", "Delicate", "Digital", "Dim", "Dirty", "Discolored", "Dotted", "Drab", "Dreary", "Dull", "Dusty", "Earth", "Electric", "Eye-Catching", "Faded", "Faint", "Festive", "Fiery", "Flashy", "Flattering", "Flecked", "Florescent", "Frosty", "Full-Toned", "Glistening", "Glittering", "Glowing", "Harsh", "Hazy", "Hot", "Hued", "Icy", "Illuminated", "Incandescent", "Intense", "Interwoven", "Iridescent", "Kaleidoscopic", "Lambent", "Light", "Loud", "Luminous", "Lusterless", "Lustrous", "Majestic", "Marbled", "Matte", "Medium", "Mellow", "Milky", "Mingled", "Mixed", "Monochromatic", "Motley", "Mottled", "Muddy", "Multicolored", "Multihued", "Murky", "Natural", "Neutral", "Opalescent", "Opaque", "Pale", "Pastel", "Patchwork", "Patchy", "Patterned", "Perfect", "Picturesque", "Plain", "Primary", "Prismatic", "Psychedelic", "Pure", "Radiant", "Reflective", "Rich", "Royal", "Ruddy", "Rustic", "Satiny", "Saturated", "Secondary", "Shaded", "Sheer", "Shining", "Shiny", "Shocking", "Showy", "Smoky", "Soft", "Solid", "Somber", "Soothing", "Sooty", "Sparkling", "Speckled", "Stained", "Streaked", "Streaky", "Striking", "Strong Neutral", "Subtle", "Sunny", "Swirling", "Tinged", "Tinted", "Tonal", "Toned", "Translucent", "Transparent", "Two-Tone", "Undiluted", "Uneven", "Uniform", "Vibrant", "Vivid", "Wan", "Warm", "Washed-Out", "Waxen", "Wild"]; - biomNames = ["Hot desert","Savanna","Tropical dry forest","Tropical wet forest","Xeric srubland","Temperate dry grassland","Temperate wet grassland","Temperate deciduous forest","Subtropical rain forest","Cold desert","Temperate rain forest","Coniferous wet forest","Temperate coniferous forest","Subtaiga","Boreal wet forest","Boreal dry forest","Subpolar scrub","Subpolar desert","Tundra","Rocky desert ","Polar desert","Glacier"]; - biomColors = ["#fbfaae","#eef586","#b6d95d","#7dcb35","#d6dd7f","#bdde82","#a1d77a","#29bc56","#76bd32","#e1df9b","#45b348","#52a444","#6fb252","#567c2c","#618a38","#a4b36d","#acb076","#b5ad8b","#d5d59d","#bfbfbf","#f2f2f2","#fafeff"]; - biomIDs = "2,3,3,3,3,8,8,8,8,8,8,8,8,8,8,8,8,8,8,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,13,13,13,13,14,14,14,14,14,14,14,14,18,18,18,18,18,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21||2,2,3,3,3,3,8,8,8,8,8,8,8,8,8,8,8,8,8,8,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,13,13,13,13,14,14,14,14,14,14,14,18,18,18,18,18,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21||1,2,2,3,3,3,8,8,8,8,8,8,8,8,8,8,8,8,8,8,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,13,13,13,13,14,14,14,14,14,14,14,18,18,18,18,18,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21||1,1,2,2,2,2,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,13,13,13,13,13,13,14,14,14,14,14,14,14,18,18,18,18,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21||1,1,2,2,2,2,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,12,12,12,12,12,12,12,12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,18,18,18,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21||1,1,1,2,2,2,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,12,12,12,12,12,12,12,12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,18,18,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21||0,1,1,1,1,2,2,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,18,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21||0,0,1,1,1,1,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21||0,0,0,1,1,1,1,1,5,5,5,5,5,5,5,5,5,5,5,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,16,16,16,16,16,16,16,16,16,16,16,16,16,16,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21||0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,17,17,17,17,17,17,17,17,17,17,17,17,17,17,19,19,19,19,19,19,19,19,19,19,19,19,20,20,20,20,21,21,21,21,21"; - biomGrad = "#b6d95d,#aad453,#9fcf4b,#96cb44,#8ec73f,#88c53b,#83c438,#7fc236,#7cc034,#7abf33,#78be32,#77be32,#76be33,#75be34,#73be35,#6fbd37,#6bbc3a,#66bb3d,#61ba40,#5cb942,#57b844,#53b745,#50b646,#4eb347,#4eb047,#4eae46,#4fac45,#50aa44,#51a844,#52a644,#52a544,#52a444,#52a444,#52a444,#52a444,#52a444,#52a444,#52a444,#52a444,#52a444,#52a444,#52a444,#52a444,#52a444,#52a444,#52a444,#52a444,#52a444,#52a444,#52a444,#52a444,#52a444,#52a444,#53a343,#54a242,#559f40,#569b3e,#57973b,#589238,#598e35,#5a8a33,#5b8732,#5c8532,#5d8432,#5d8533,#5e8534,#608535,#648737,#6b8b3c,#769244,#839a4f,#90a35b,#9dad6a,#a8b87b,#b1c38d,#b9cd9f,#c1d6b1,#c9dec1,#cfe5d0,#d6ebdc,#ddf0e6,#e3f4ed,#e8f7f2,#ecfaf6,#effcf9,#f2fdfb,#f4fdfd,#f6fdfe,#f8fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#fafeff||#c5df67,#b8d95d,#abd455,#9fd04e,#95cc49,#8bc944,#84c841,#7ec63f,#79c43d,#76c33c,#73c23b,#71c13b,#6fc13c,#6dc03d,#6bc03d,#68c03f,#65bf41,#61be44,#5dbd46,#59bc47,#55bb49,#51ba4a,#4eb94b,#4db64b,#4db34a,#4db149,#4eaf48,#4fae48,#50ac48,#50ab48,#50aa48,#50a948,#50a948,#50a948,#51a948,#51a847,#51a847,#52a847,#52a847,#52a847,#52a847,#52a847,#52a847,#52a847,#53a847,#53a847,#54a847,#54a847,#55a847,#55a847,#57a847,#58a847,#58a747,#59a746,#5aa645,#5ba343,#5c9f41,#5d9b3e,#5d963b,#5e9238,#5e8e36,#5f8a35,#5f8835,#608736,#608736,#618737,#628737,#658838,#6b8b3c,#759143,#81984c,#8ca057,#99a965,#a4b476,#adbf88,#b5ca9b,#bed3ae,#c6dcbe,#cce3ce,#d4e9da,#dbefe5,#e2f4ec,#e7f7f2,#ecfaf6,#effcf9,#f2fdfb,#f4fdfd,#f6fdfe,#f8fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#fafeff||#d2e572,#c5de68,#b7d95f,#aad458,#9ed153,#93ce4e,#8acc4b,#82ca48,#7cc846,#78c745,#74c645,#71c545,#6fc445,#6dc446,#6bc346,#68c348,#66c349,#62c24b,#5fc04d,#5cbf4e,#5abf4f,#57be50,#54bc50,#54ba4f,#53b84f,#54b64e,#54b44d,#55b34d,#56b24d,#56b14d,#56b04d,#55b04d,#55b04d,#55b04d,#57af4d,#57ae4c,#57ae4c,#58ae4c,#58ae4c,#59ae4c,#59ae4c,#59ae4c,#59ae4c,#59ae4c,#5aae4c,#59af4c,#5baf4c,#5cae4c,#5eae4c,#5fae4c,#61ad4c,#62ad4c,#63ac4c,#64ac4b,#65ab4a,#66a949,#67a547,#67a144,#679c41,#68983e,#68943c,#68903b,#678d3a,#688c3b,#678c3b,#688b3b,#688b3b,#6b8b3c,#708e3f,#789245,#82984c,#8c9f56,#97a763,#a1b273,#aabd85,#b2c798,#bbd1ab,#c3dabc,#cae1cc,#d3e8d9,#daeee4,#e2f3eb,#e7f7f1,#ebf9f5,#effcf9,#f2fdfb,#f4fdfd,#f6fdfe,#f8fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#fafeff||#ddea7d,#d1e373,#c3de6a,#b6d962,#a9d55c,#9ed258,#94d055,#8cce52,#85cc50,#80cb4f,#7cca4f,#79c94f,#76c84f,#74c84f,#72c750,#70c751,#6ec752,#6cc653,#6ac454,#68c454,#66c455,#64c356,#63c155,#63c055,#62be55,#62bc54,#62bb53,#63ba53,#63b953,#63b853,#63b853,#63b853,#63b853,#63b853,#64b753,#65b653,#65b653,#65b653,#65b653,#66b653,#67b653,#67b653,#67b653,#67b653,#68b653,#68b752,#69b652,#6ab652,#6cb552,#6eb552,#6fb452,#71b452,#72b352,#73b352,#74b251,#75b050,#76ad4e,#76a94c,#75a549,#75a047,#759c45,#749843,#739542,#739343,#719242,#719142,#719042,#739042,#779244,#7d9549,#859a4e,#8ea057,#97a763,#a0b172,#a9bc84,#b1c696,#b9cfa9,#c1d9bb,#c9e0cb,#d2e7d8,#d9ede3,#e1f2ea,#e6f6f1,#eaf9f5,#eefbf9,#f2fcfb,#f4fcfd,#f6fcfe,#f8fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#f9fdfe,#fafeff||#e6ee88,#dbe87e,#cfe375,#c3de6d,#b7da67,#acd762,#a2d55f,#9ad35c,#93d15a,#8ed059,#8acf59,#86ce59,#84cd59,#82cd59,#81cc59,#80cc5a,#7ecc5a,#7dcb5b,#7bca5b,#7aca5b,#78ca5c,#77c95c,#76c75b,#77c65b,#76c55b,#76c35b,#76c25a,#77c25a,#77c15a,#77c15a,#76c15a,#76c05a,#76c05a,#77c05a,#78bf5a,#78be5a,#78be5a,#78be5a,#78be5a,#79be5a,#7abe5a,#7abe5a,#7abe5a,#7abe5a,#7abf5a,#7bbf5a,#7cbe5a,#7dbe5a,#7ebd5a,#80bd5a,#81bc5a,#83bc5a,#84bb5a,#85bb5a,#86ba59,#87b858,#87b657,#87b255,#86ae53,#85aa51,#84a54f,#83a14d,#819e4c,#809b4c,#7e994b,#7d974b,#7d964b,#7e964a,#81974c,#86994f,#8c9c53,#93a15a,#9aa865,#a2b173,#aabb83,#b1c495,#b8cda7,#bfd7b9,#c6dec9,#cfe5d6,#d6ebe1,#def0e8,#e4f4ef,#e9f7f3,#edf9f7,#f0faf9,#f2fbfb,#f4fbfc,#f6fcfd,#f7fcfd,#f7fcfd,#f7fcfd,#f7fdfd,#f8fcfe,#f8fdfe,#f8fdfe,#f8fdfe,#f9fdff,#f9fdff,#fafeff||#edf191,#e4ec88,#dae77f,#cfe378,#c5df73,#bcdc6e,#b3db6b,#acd968,#a6d866,#a1d765,#9dd665,#9ad465,#98d365,#97d365,#96d265,#95d165,#94d164,#93d064,#92d064,#91cf64,#90cf64,#8fce64,#8ecc63,#8ecc63,#8dcb63,#8dca63,#8dc962,#8dc962,#8dc862,#8dc862,#8cc862,#8cc762,#8cc762,#8dc762,#8ec662,#8ec663,#8ec663,#8ec663,#8ec663,#8fc663,#90c663,#90c663,#90c663,#90c663,#90c663,#91c663,#92c563,#93c563,#94c563,#96c563,#96c363,#98c363,#98c364,#98c364,#99c263,#9ac062,#9abe61,#9abb60,#99b85e,#97b45c,#96af5a,#94ab59,#92a758,#90a457,#8ea157,#8c9e56,#8b9d56,#8c9c55,#8d9c56,#919d58,#959f5b,#9aa360,#9fa969,#a5b175,#acb984,#b2c294,#b8caa5,#bed3b6,#c4dac5,#cbe0d2,#d3e6dc,#d9eae3,#dfeee9,#e3f1ed,#e7f3f0,#eaf4f3,#ecf5f5,#eff6f6,#f1f7f7,#f2f8f8,#f3f9f9,#f4fafa,#f4fbfb,#f5fbfc,#f6fcfd,#f7fcfe,#f7fdfe,#f8fdff,#f9fdff,#fafeff||#f2f399,#ebef91,#e4eb8a,#dbe884,#d4e57f,#cde37b,#c6e178,#c0e076,#bbdf74,#b7de73,#b4dd73,#b1dc73,#b0db73,#b0db73,#afda72,#add972,#add871,#abd671,#aad570,#a9d470,#a8d46f,#a7d36e,#a6d16e,#a6d16d,#a5d06d,#a5cf6d,#a5ce6d,#a5ce6d,#a5ce6d,#a5ce6d,#a4ce6d,#a4cd6d,#a4cd6d,#a4cd6d,#a4cd6d,#a5cc6e,#a5cc6e,#a5cc6e,#a5cc6e,#a5cc6e,#a6cc6e,#a6cc6e,#a6cc6e,#a6cc6e,#a6cc6e,#a7cc6e,#a8cb6e,#a9cb6e,#aacb6e,#abcb6e,#abca6e,#acca6e,#acca6f,#acca6f,#adc96e,#adc86e,#adc66d,#adc46c,#acc16b,#aabe69,#a8b968,#a6b566,#a3b065,#a1ad64,#9ea964,#9ca663,#9aa462,#9aa261,#9ba162,#9ca263,#9fa365,#a2a569,#a5aa6f,#a9b179,#aeb786,#b3bf94,#b7c6a3,#bccdb1,#c1d3bf,#c6d9ca,#ccded3,#d2e1da,#d7e5df,#dbe7e3,#dee9e6,#e1eae9,#e4eceb,#e7eded,#e9efef,#ebf0f0,#edf2f2,#eff5f4,#f1f7f6,#f2f9f9,#f4fafb,#f5fbfc,#f5fcfd,#f7fdfe,#f8fdff,#fafeff||#f6f5a1,#f1f29a,#ecf095,#e7ee91,#e2ec8e,#deea8b,#d9e988,#d5e886,#d2e885,#cfe784,#cde684,#cbe684,#cae584,#cae584,#c9e383,#c7e283,#c6e081,#c4de80,#c3dc7f,#c1db7e,#c0da7c,#bfd97c,#bdd77c,#bcd67b,#bcd57a,#bbd47a,#bbd37a,#bbd37a,#bbd37a,#bbd37a,#bbd37a,#bbd37a,#bbd37a,#bbd37a,#bbd37a,#bbd27b,#bbd27b,#bbd27b,#bbd27b,#bbd27b,#bcd27b,#bcd27b,#bcd27b,#bcd27b,#bcd27b,#bdd27b,#bdd17b,#bdd17b,#bed17b,#bed17b,#bed17b,#bfd17b,#bfd17c,#bfd17c,#c0d07c,#c0cf7c,#c0ce7c,#bfcd7b,#beca7a,#bdc878,#bbc377,#b8bf75,#b5ba74,#b2b673,#aeb272,#abae71,#a9ab70,#a8a86f,#a8a770,#a8a770,#a9a771,#aaa873,#acac77,#aeb07e,#b0b588,#b3bb94,#b5c0a0,#b9c6ac,#bccbb7,#c0d0c1,#c4d4c8,#c9d6ce,#cdd9d3,#d0dad6,#d3dcd9,#d6dddc,#d9dfde,#dce1e1,#e0e4e3,#e3e6e6,#e6eae9,#eaedec,#edf1f0,#eff4f3,#f1f6f6,#f3f8f8,#f4fafa,#f6fcfc,#f7fdfe,#fafeff||#f9f7a8,#f6f6a4,#f4f5a1,#f1f49f,#eff39e,#edf29c,#ebf19b,#e9f199,#e8f199,#e6f098,#e5f098,#e4f098,#e4ef98,#e3ef98,#e2ed97,#e0ec96,#dfea94,#dde792,#dae491,#d8e28f,#d6e08d,#d4de8c,#d2dc8c,#d1db8b,#d0da8a,#cfd98a,#cfd98a,#cfd98a,#cfd98a,#cfd98a,#cfd98a,#cfd98a,#cfd98a,#cfd98a,#cfd98a,#cfd88a,#cfd88a,#cfd88a,#cfd88a,#cfd88a,#d0d88a,#d0d88a,#d0d88a,#d0d88a,#d0d88a,#d0d88a,#d0d88a,#d0d88a,#d0d88a,#d0d88a,#d0d88a,#d1d88a,#d1d88b,#d1d88b,#d1d78b,#d1d78b,#d1d68b,#d1d68b,#d0d48a,#cfd288,#cdce87,#cac986,#c6c484,#c2bf83,#beba81,#bbb680,#b8b27f,#b5af7e,#b3ad7e,#b2ac7e,#b2ab7e,#b2ac7f,#b2ae81,#b2b085,#b2b38b,#b3b794,#b3bb9d,#b5bfa7,#b7c2af,#bac6b7,#bcc9bd,#bfcac2,#c3ccc6,#c5ccc8,#c7ceca,#c9cfcd,#cdd1d0,#d1d3d3,#d6d7d7,#dadbdb,#dfe0e0,#e4e5e4,#e8eae9,#eceeed,#eff2f1,#f2f4f4,#f3f7f7,#f5f9f9,#f7fcfc,#fafeff||#fbfaae,#fbfaae,#fbfaae,#fbfaae,#fbfaae,#fbfaae,#fbfaae,#fbfaae,#fbfaae,#fbfaae,#fbfaae,#fbfaae,#fbfaae,#faf9ad,#f9f8ac,#f7f6ab,#f5f4a9,#f3f1a6,#efeda4,#eceaa2,#e9e7a0,#e6e49e,#e4e29d,#e2e09c,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9b,#e1df9a,#e0dd99,#ded998,#dbd497,#d7cf95,#d2c993,#cdc391,#c9be8f,#c5b98f,#c0b68e,#bdb38d,#bab28c,#b9b08b,#b8b08b,#b7b08b,#b5b08c,#b3b18f,#b2b394,#b1b69b,#b1b8a2,#b2baa8,#b3bcae,#b4beb3,#b6bfb6,#b8bfb9,#babfba,#bbc0bc,#bdc1bf,#c1c3c2,#c6c6c6,#cbcbcb,#d1d1d1,#d7d7d7,#dddddd,#e3e3e3,#e8e8e8,#ededed,#f0f1f1,#f2f4f4,#f4f7f7,#f7fbfb,#fafeff"; - biomIDs = biomIDs.split("||"); - biomIDs = biomIDs.map(function(m) {return m.split(",");}) - biomGrad = biomGrad.split("||"); - biomGrad = biomGrad.map(function(m) {return m.split(",");}) - } - - // Calculate Voronoi Diagram - function calculateVoronoi(points) { - diagram = voronoi(points), - polygons = diagram.polygons(); - } - - // Find cells for every x/y point - function findCells(points) { - console.time('findCells'); - pointsCells = []; - points.map(function(i, d) { - if (!pointsCells[i[1]]) {pointsCells[i[1]] = [];} - pointsCells[i[1]][i[0]] = d; - neighborCells(i[1], i[0], 2); - }); - d3.range(0, mapHeight).forEach(function(y) { - d3.range(0, mapWidth).forEach(function(x) { - if (!pointsCells[y]) {pointsCells[y] = [];} - if (!pointsCells[y][x]) { - pointsCells[y][x] = diagram.find(x, y).index; - neighborCells(y, x, 1); - } - }); - }); - console.timeEnd('findCells'); - } - - function neighborCells(y, x, l) { - if (y > l && x > l && y + l < mapHeight && x + l < mapWidth) { - var v = pointsCells[y][x]; - for (c = l * -1; c < l; c ++) { - if (!pointsCells[y+c]) {pointsCells[y+c] = [];} - if (!pointsCells[y-c]) {pointsCells[y-c] = [];} - pointsCells[y+c][x] = v; - pointsCells[y+c][x+c] = v; - pointsCells[y][x+c] = v; - pointsCells[y][x-c] = v; - if (c > 1 || c < -1) { - var p = c+1; - if (!pointsCells[y+p]) {pointsCells[y+p] = [];} - if (!pointsCells[y-p]) {pointsCells[y-p] = [];} - pointsCells[y+c][x+p] = v; - pointsCells[y+c][x-p] = v; - pointsCells[y+p][x+c] = v; - pointsCells[y+p][x-c] = v; - } - } - } - } - - function detectNeighbors() { - console.time("detectNeighbors"); - // define neighbors for each polygon - polygons.map(function(i, d) { - i.index = d; - if (!i.height) {i.height = 0;} - var neighbors = []; - diagram.cells[d].halfedges.forEach(function(e) { - var edge = diagram.edges[e], ea; - if (edge.left && edge.right) { - ea = edge.left.index; - if (ea === d) { - ea = edge.right.index; - } - neighbors.push(ea); - } else { - if (edge.left) { - ea = edge.left.index; - } else { - ea = edge.right.index; - } - polygons[ea].type = -99; // map border - } - }) - i.neighbors = neighbors; - }); - console.timeEnd("detectNeighbors"); - } - - function addMountain() { - var x = Math.floor(Math.random() * mapWidth / 2 + mapWidth / 4); - var y = Math.floor(Math.random() * mapHeight / 3 + mapHeight / 3); - var rnd = diagram.find(x, y).index; - var height = Math.random() * 0.1 + 0.9; - add(rnd, "mountain", height); - } - - function addHill(count, shift) { - // shift from 0 to 0.5 - for (c = 0; c < count; c++) { - var limit = 0; - do { - var height = Math.random() * 0.4 + 0.1; - var x = Math.floor(Math.random() * mapWidth * (1-shift*2) + mapWidth * shift); - var y = Math.floor(Math.random() * mapHeight * (1-shift*2) + mapHeight * shift); - var rnd = diagram.find(x, y).index; - limit ++; - } while (polygons[rnd].height + height > 0.9 && limit < 100) - add(rnd, "hill", height); - } - } - - function add(start, type, height) { - var sharpness = 0.2; - var radius = 0.99; - if (type === "mountain") {radius = 0.9;} - var queue = []; // polygons to check - var used = []; // used polygons - polygons[start].height += height; - polygons[start].feature = undefined; - queue.push(start); - used.push(start); - for (i = 0; i < queue.length && height > 0.01; i++) { - if (type == "mountain") { - height = polygons[queue[i]].height * radius - height/100; - } else { - height = height * radius; - } - polygons[queue[i]].neighbors.forEach(function(e) { - if (used.indexOf(e) < 0) { - var mod = Math.random() * sharpness + 1.1 - sharpness; - if (sharpness == 0) {mod = 1;} - polygons[e].height += height * mod; - if (polygons[e].height > 1) { - polygons[e].height = 1; - } - polygons[e].feature = undefined; - queue.push(e); - used.push(e); - } - }); - } - } - - function addRange(mod) { - var count = Math.abs(mod); - for (c = 0; c < count; c++) { - var from, to, diff = 0; - do { - var xf = Math.floor(Math.random() * (mapWidth*0.7)) + mapWidth*0.15; - var yf = Math.floor(Math.random() * (mapHeight*0.6)) + mapHeight*0.2; - from = diagram.find(xf, yf).index; - var xt = Math.floor(Math.random() * (mapWidth*0.7)) + mapWidth*0.15; - var yt = Math.floor(Math.random() * (mapHeight*0.6)) + mapHeight*0.2; - to = diagram.find(xt, yt).index; - diff = Math.hypot(xt - xf, yt - yf); - } while (diff < 180 || diff > 400) - var range = []; - if (from && to) { - for (var l = 0; from != to && l < 1000; l++) { - var min = 10000; - polygons[from].neighbors.forEach(function(e) { - diff = Math.hypot(polygons[to].data[0] - polygons[e].data[0], polygons[to].data[1] - polygons[e].data[1]); - if (Math.random() > 0.5) {diff = diff/2} - if (diff < min) { - min = diff; - from = e; - } - }); - range.push(from); - } - } - if (range.length > 0) { - var change = Math.random() * 0.4 + 0.1; - var query = []; - var used = []; - for (var i = 1; change > 0.01; i++) { - var rnd = Math.random() * 0.4 + 0.8; - change -= i / 30 * rnd; - range.map(function(r) { - polygons[r].neighbors.forEach(function(e) { - if (used.indexOf(e) == -1 && Math.random() > 0.2 && change > 0) { - query.push(e); - used.push(e); - if (mod > 0) { - polygons[e].height += change; - if (polygons[e].height > 1) {polygons[e].height = 1;} - } else if (polygons[e].height >= 0.2) { - polygons[e].height -= change; - if (polygons[e].height < 0.1) { - polygons[e].height = 0.13 + i/100; - if (polygons[e].height >= 0.2) {polygons[e].height = 0.19;} - } - } - } - }); - range = query.slice(); - }); - } - } - } - } - - function addPit(count) { - for (c = 0; c < count; c++) { - var change = Math.random() * 0.3 + 0.2; - var limit = 0; // iterations limit - do { - rnd = Math.floor(Math.random() * polygons.length); - limit++; - } while (polygons[rnd].height < 0.17 && limit < 100) - var query = [rnd], used = []; - for (var i = 1; change > 0.01; i++) { - var rnd = Math.random() * 0.4 + 0.8; - change -= i / 60 * rnd; - query.map(function(p) { - polygons[p].neighbors.forEach(function(e) { - if (used.indexOf(e) == -1 && change > 0) { - query.push(e); - used.push(e); - polygons[e].height -= change; - if (polygons[e].height < 0.1) { - polygons[e].height = 0.1 + i/100; - if (polygons[e].height >= 0.2) {polygons[e].height = 0.19;} - } - } - }); - }); - } - } - } - - function getNoise(nx, ny) { - return simplex.noise2D(nx, ny) / 2 + 0.5; - } - - function addNoise() { - console.time("addNoise"); - pointsHeights = [], pointsCellHeights = [], pointsCells = []; - // SimplexNoise by Jonas Wagner - simplex = new SimplexNoise(); - d3.range(0, mapHeight).forEach(function(y) { - d3.range(0, mapWidth).forEach(function(x) { - var cell = diagram.find(x, y).index; - if (!pointsCells[y]) {pointsCells[y] = [];} - pointsCells[y][x] = cell; - var cellHeight = polygons[cell].height; - if (cellHeight >= 0.2) { - var nx = x / mapWidth - 0.5; - var ny = y / mapHeight - 0.5; - var noise = getNoise(2 * nx, 2 * ny) / 2; - noise += getNoise(4 * nx, 4 * ny) / 4; - noise += getNoise(8 * nx, 8 * ny) / 8; - var height = (cellHeight * 2 + noise) / 3; - if (height < 0.2) {height = 0.2;} - pointsCellHeights.push(height); - height += (Math.floor(Math.random() * 3) - 1) / 100; - pointsHeights.push(height); - } else { - pointsCellHeights.push(cellHeight); - pointsHeights.push(cellHeight); - } - }); - }); - console.timeEnd("addNoise"); - } - - function showNoise() { - coastline.selectAll("*").remove(); - hCells.selectAll("*").remove(); - polygons.forEach(function(i) { - x = Math.floor(i.data[0]); - y = Math.floor(i.data[1]); - var height = pointsCellHeights[x + y * mapWidth]; - if (height >= 0.2) { - var clr = bright(1 - height); - hCells.append("path") - .attr("d", "M" + i.join("L") + "Z") - .attr("stroke", clr) - .attr("fill", clr); - } - }); - } - - function applyNoise() { - polygons.forEach(function(i) { - if (i.height >= 0.2) { - x = i.data[0]; - y = i.data[1]; - i.height = pointsCellHeights[x + y * mapWidth]; - } - }); - } - - function drawMapBase(style) { - console.time("drawMapBase"); - // remove map base elements to redraw - mapCells.selectAll("*").remove(); - mapContours.selectAll("*").remove(); - // detect color scheme with Evil - var color = eval(mapColor.value), clr; - // set backgroud color for islands - if (mapStyle.value === "map_flat") { - clr = "#f9f9eb"; - } else if (mapStyle.value === "map_shaded") { - clr = sepia(0.2); - } else if (mapType.value === "heightmap") { - clr = color(0.75); - } else { - var temp = Math.floor(20 - (temperatureInput.value - 12) / 0.2); - if (temp > 99) {temp = 99;} // max value - if (temp < 0) {temp = 0;} // min value - clr = biomGrad[1][temp]; - } - d3.selectAll(".islandBack").attr("fill", clr); - // "polygonal" map style - if (mapStyle.value === "map_polygonal") { - polygons.map(function(i) { - if (i.height >= 0.2) { - var clr; - if (mapType.value === "heightmap") {clr = color(1 - i.height);} - if (mapType.value === "biomes") {clr = biomColors[i.biom];} - mapCells.append("path") - .attr("shape-rendering", "geometricPrecision") - .attr("d", "M" + i.join("L") + "Z") - .attr("fill", clr) - .attr("stroke", clr) - .attr("stroke-width", 0.7); - } - }); - } - // 'triangled' map style - if (mapStyle.value === "map_triangled") { - diagram.edges.forEach(function(e) { - if (e.left && e.right) { - var clrR, clrL, hDelta = 0; - var hLeft = polygons[e.left.index].height; - var hRight = polygons[e.right.index].height; - if (hLeft >= 0.2 || hRight >= 0.2) { - var dR = e[0][0] + " " + e[0][1] + " L" + e.right[0] + " " + e.right[1] + " L" + e[1][0] + " " + e[1][1]; - var dL = e[0][0] + " " + e[0][1] + " L" + e.left[0] + " " + e.left[1] + " L" + e[1][0] + " " + e[1][1]; - hDelta = hRight - hLeft; - if (mapType.value === "heightmap") { - clrR = d3.hsl(color(1 - hRight + hDelta / 3)); - clrL = d3.hsl(color(1 - hLeft - hDelta / 3)); - } - if (mapType.value === "biomes") { - var cR = polygons[e.right.index].biomColor; - var cL = polygons[e.left.index].biomColor; - clrR = d3.hsl(d3.interpolateLab(cR, cL)(0.33)); - clrL = d3.hsl(d3.interpolateLab(cL, cR)(0.33)); - } - if (hLeft >= 0.2 && hRight >= 0.2) { - clrR = clrR.darker(hDelta * 2 * hRight); - if (hDelta > 0.02) { - clrR.l -= hDelta / 4; - } - clrL = clrL.darker(hDelta); - } - mapCells.append("path") - .attr("d", "M" + dR + "Z") - .attr("fill", clrR); - mapCells.append("path") - .attr("d", "M" + dL + "Z") - .attr("fill", clrL); - } - } - }) - } - // 'noisy' map style - if (mapStyle.value === "map_noisy") { - if (mapType.value === "heightmap") { - mapCells.selectAll("path") - .data(d3.contours() - .size([mapWidth, mapHeight]) - .thresholds(d3.range(0.2, 0.9, 0.04)) - (pointsHeights)) - .enter().append("path") - .attr("d", d3.geoPath()) - .attr("fill", function(d) { return color(0.95-d.value);}); - } - if (mapType.value === "biomes") { - mapCells.selectAll("path") - .data(d3.contours() - .size([mapWidth, mapHeight]) - .thresholds(d3.range(0, 22)) - .smooth(false) - (pointsBiomes)) - .enter().append("path") - .attr("d", d3.geoPath()) - .attr("fill", function(d) {return biomColors[d.value]}); - } - } - // 'contours' map style - if (mapStyle.value === "map_contours") { - mapCells.selectAll("path") - .data(d3.contours() - .size([mapWidth, mapHeight]) - .thresholds(d3.range(0.2, 0.9, 0.04)) - (pointsHeights)) - .enter().append("path") - .attr("d", d3.geoPath()) - .attr("fill", function(d) {return color(0.95-d.value);}); - var data = d3.contours() - .size([mapWidth, mapHeight]) - .thresholds(d3.range(0.22, 0.9, 0.04)) - (pointsCellHeights); - var contours = mapContours.selectAll("p") - .data(data).enter().append("g") - .attr("shape-rendering", "geometricPrecision"); - contours.data(data).append("path") - .attr("d", d3.geoPath()) - .attr("class", "contoursShade") - .attr("transform", "translate("+0.5/scale+" "+0.6/scale+")") - .attr("opacity", 4/scale) - .attr("fill", function(d) { return d3.hsl(color(0.95-d.value)).darker(2)}); - contours.data(data).append("path") - .attr("d", d3.geoPath()) - .attr("fill", function(d) { return color(0.95-d.value)}); - } - // 'relaxed' map style - if (mapStyle.value === "map_relaxed") { - var cont = []; - lineGen.curve(d3.curveBasisClosed); - if (mapType.value === "biomes") { - console.time("range") - var range = [...new Set(pointsBiomes)]; - range.shift(); - range.sort(sortNumber); - console.timeEnd("range") - var data = d3.contours() - .size([mapWidth, mapHeight]) - .thresholds(d3.range(0, 22)) - .smooth(false) - (pointsBiomes) - range.forEach(function(d) { - cont[d] = [data[d]]; - var el = defs.data(cont[d]).append("path").attr("d", d3.geoPath()); - var path = el.node().getPathData(); - var elements = [{scX:path[0].values[0], scY:path[0].values[1]}]; - var p = ""; - for (var s = 1; s < path.length; s++) { - if (path[s].type == "M") { - if (elements.length > 8) { - p += lineGen(elements); - } - elements = []; - } - if (path[s].type != "Z" && s % 4 == 1) { - elements.push({scX:path[s].values[0], scY:path[s].values[1]}); - } - } - mapCells.append("path") - .attr("id", d).attr("d", p) - .attr("fill", biomColors[d]) - .attr("shape-rendering", "geometricPrecision"); - }); - } else { - var range = d3.range(0.22, 0.9, 0.04); - var data = d3.contours() - .size([mapWidth, mapHeight]) - .thresholds(range) - (pointsCellHeights); - range.forEach(function(d, i) { - cont[i] = [data[i]]; - var clr = color(0.95-d.toFixed(2)); - var el = defs.data(cont[i]).append("path").attr("d", d3.geoPath()); - var path = el.node().getPathData(); - var p = ""; - if (path.length > 0) { - var elements = [{scX:path[0].values[0], scY:path[0].values[1]}]; - } - for (var s = 1; s < path.length; s++) { - if (path[s].type == "M") { - if (elements.length > 8) {p += lineGen(elements);} - elements = []; - } - if (path[s].type != "Z" && s % 4 == 1) { - elements.push({scX:path[s].values[0], scY:path[s].values[1]}); - } - } - mapCells.append("path").attr("d", p).attr("fill", clr) - .attr("shape-rendering", "geometricPrecision"); - }); - } - } - // 'shaded' map style - if (mapStyle.value === "map_shaded") { - mapCells.selectAll("path") - .data(d3.contours() - .size([mapWidth, mapHeight]) - .thresholds(d3.range(0.2, 0.9, 0.04)) - (pointsCellHeights)) - .enter().append("path") - .attr("d", d3.geoPath()) - .attr("fill", function(d) {return sepia(d.value);}) - .attr("stroke", "none") - .attr("filter", "url(#blurFilter)"); - } - console.timeEnd("drawMapBase"); - } - - function drawHeightmap(change) { - hCells.selectAll("*").remove(); - var nonzero = $.grep(polygons, function(e) {return (e.height);}); - nonzero.map(function(i) { - if (change) {i.height += change;} - if (i.height > 1) {i.height = 1;} - if (i.height < 0) {i.height = 0;} - var clr = bright(1 - i.height); - hCells.append("path") - .attr("d", "M" + i.join("L") + "Z") - .attr("stroke", clr) - .attr("fill", clr); - }); - } - - // Draw edgy coastline for the Journey - function mockCoastline() { - coastline.selectAll("*").remove(); - var edges = []; - for (var i = 0; i < polygons.length; i++) { - if (polygons[i].height >= 0.2) { - var cell = diagram.cells[i]; - cell.halfedges.forEach(function(e) { - var edge = diagram.edges[e]; - if (edge.left && edge.right) { - var ea = edge.left.index; - if (ea === i) {ea = edge.right.index;} - if (polygons[ea].height < 0.2) { - var start = edge[0].join(" "); - var end = edge[1].join(" "); - edges.push({start, end}); - polygons[ea].type = -1; - } - } - }) - } - } - lineGen.curve(d3.curveLinear); - var line = getContinuousLine(edges, 0, 0); - coastline.append("path").attr("d", line); - } - - // Draw selection - function drawSelection() { - selected.selectAll("*").remove(); - selection.map(function(i) { - selected.append("path") - .attr("d", "M" + polygons[i].join("L") + "Z"); - }); - } - - function getPrecipitation(prec) { - if (prec > 0.9) {return 0;} - if (prec > 0.75) {return 1;} - if (prec > 0.6) {return 2;} - if (prec > 0.5) {return 3;} - if (prec > 0.4) {return 4;} - if (prec > 0.3) {return 5;} - if (prec > 0.2) {return 6;} - if (prec > 0.05) {return 7;} - if (prec > 0.02) {return 8;} - return 9; - } - - // Mark and name features (ocean, lakes, isles) - function markFeatures() { - console.time("markFeatures"); - var queue = [], island = 0, lake = 0, number = 0, type, name, greater = 0, less = 0; - var start = diagram.find(0, 0).index; // start for top left corner to define Ocean first - var unmarked = [polygons[start]]; - while (unmarked.length > 0) { - if (unmarked[0].height >= 0.2) { - type = "Island"; - number = island; - island += 1; - greater = 0.2; - less = 100; // just to omit exclusion - } else { - type = "Lake"; - number = lake; - lake += 1; - greater = -100; // just to omit exclusion - less = 0.2; - } - if (type == "Lake" && number == 0) {type = "Ocean";} - start = unmarked[0].index; - queue.push(start); - polygons[start].feature = type; - polygons[start].featureNumber = number; - while (queue.length > 0) { - var i = queue[0]; - queue.shift(); - polygons[i].neighbors.forEach(function(e) { - if (!polygons[e].feature && polygons[e].height >= greater && polygons[e].height < less) { - polygons[e].feature = type; - polygons[e].featureNumber = number; - queue.push(e); - } - if (type == "Island" && polygons[e].height < 0.2) { - polygons[i].type = 1; - polygons[e].type = -1; - } - }); - } - unmarked = $.grep(polygons, function(e) {return (!e.feature);}); - } - console.timeEnd("markFeatures"); - } - - function drawOcean(limits, colors) { - console.time("drawOcean"); - // Mark distances - var frontier = $.grep(polygons, function(e) {return (e.type === -1);}); - for (var c = -2; frontier.length > 0 && c > limits[0]; c--) { - frontier.map(function(i) { - i.neighbors.forEach(function(e) { - if (!polygons[e].type) {polygons[e].type = c;} - }); - }); - frontier = $.grep(polygons, function(e) {return (e.type === c);}); - } - // Define area edges - for (var c = 0; c < limits.length; c++) { - var edges = []; - for (var i = 0; i < polygons.length; i++) { - if (polygons[i].feature === "Ocean" && polygons[i].type >= limits[c]) { - var cell = diagram.cells[i]; - cell.halfedges.forEach(function(e) { - var edge = diagram.edges[e]; - if (edge.left && edge.right) { - var ea = edge.left.index; - if (ea === i) {ea = edge.right.index;} - var type = polygons[ea].type; - if (type < limits[c] || type == undefined) { - var start = edge[0].join(" "); - var end = edge[1].join(" "); - edges.push({start, end}); - } - } else { - var start = edge[0].join(" "); - var end = edge[1].join(" "); - edges.push({start, end}); - } - }) - } - } - lineGen.curve(d3.curveBasisClosed); - var relax = 0.8-c/10; - if (relax < 0.2) {relax = 0.2}; - var line = getContinuousLine(edges, 0, relax); - ocean.append("path").attr("d", line).attr("fill", colors[c]); - } - // Define ocean fill-rule - if (mapTemplate === "Atoll") { - ocean.attr("fill-rule", "nonzero"); - } else { - ocean.attr("fill-rule", "evenodd"); - } - console.timeEnd("drawOcean"); - } - - // Detect and draw the coasline - function drawCoastline() { - console.time('drawCoastline'); - var oceanEdges = [], lakeEdges = [], seashore = []; - for (var i = 0; i < polygons.length; i++) { - if (polygons[i].height >= 0.2) { - var cell = diagram.cells[i]; - cell.halfedges.forEach(function(e) { - var edge = diagram.edges[e]; - if (edge.left && edge.right) { - var ea = edge.left.index; - if (ea === i) {ea = edge.right.index;} - if (polygons[ea].height < 0.2) { - var start = edge[0].join(" "); - var end = edge[1].join(" "); - if (polygons[ea].feature === "Lake") { - lakeEdges.push({start, end}); - } else { - oceanEdges.push({start, end}); - } - var x = (edge[0][0] + edge[1][0]) / 2; - var y = (edge[0][1] + edge[1][1]) / 2; - // Add costline edge's centers to array to use later to place manors - seashore.push({cell: i, x, y}); - } - } - }) - } - } - lineGen.curve(d3.curveCatmullRom); //curveBasis, curveStep, curveCatmullRom; - var line = getContinuousLine(oceanEdges, 1.5, 0); - defs.select("#shape").append("path").attr("d", line); - islandBack.append("path").attr("d", line); // draw the landmass - coastline.append("path").attr("d", line).attr("class", "coastShade");; // draw the coastline - line = getContinuousLine(lakeEdges, 1.5, 0); - lakecoast.append("path").attr("d", line); // draw the lakes - console.timeEnd('drawCoastline'); - } - - function getContinuousLine(edges, indention, relax) { - var line = ""; - while (edges.length > 2) { - var edgesOrdered = []; // to store points in a correct order - var start = edges[0].start; - var end = edges[0].end; - edges.shift(); - var spl = start.split(" "); - edgesOrdered.push({scX: spl[0], scY: spl[1]}); - spl = end.split(" "); - edgesOrdered.push({scX: spl[0], scY: spl[1]}); - var x0 = spl[0]; - var y0 = spl[1]; - for (var i = 0; end !== start && i < 2000; i++) { - var next = $.grep(edges, function(e) {return (e.start == end || e.end == end);}); - if (next.length > 0) { - if (next[0].start == end) { - end = next[0].end; - } else if (next[0].end == end) { - end = next[0].start; - } - spl = end.split(" "); - var dist = Math.hypot(spl[0] - x0, spl[1] - y0); - if (dist >= indention && Math.random() > relax) { - edgesOrdered.push({scX: spl[0], scY: spl[1]}); - x0 = spl[0]; - y0 = spl[1]; - } - } - var rem = edges.indexOf(next[0]); - edges.splice(rem, 1); - } - line += lineGen(edgesOrdered) + "Z "; - } - return line; - } - - // Onclick actions - function clicked() { - if (journeyStep == 1) { - var point = d3.mouse(this), - cell = diagram.find(point[0], point[1]).index, - status = map_mode.getAttribute("status"); - if (status == 1) { - var power = +$("#change_power").text(); - if ($("#draw_increase").attr("status") == 1) {polygons[c2].height += power;} - if ($("#draw_decrease").attr("status") == 1) {polygons[c2].height -= power;} - if ($("#draw_erase").attr("status") == 1) {polygons[c2].height = 0;} - if ($("#draw_smooth").attr("status") == 1) { - var heights = [polygons[cell].height]; - polygons[cell].neighbors.forEach(function(e) {heights.push(polygons[e].height);}); - polygons[cell].height = d3.mean(heights); - } - drawHeightmap(); - mockCoastline(); - } else if (status == 2) { - var index = selection.indexOf(cell); - if (index == -1) { - if (cell_line.getAttribute("start") == "") { - selection.push(cell); - } else { // cell_line - add highlighted to selection - addHighlighted(); - cell_line.setAttribute("start", cell); - } - } else { - if (cell_line.getAttribute("start") == "") { - selection.splice(index, 1); - } else { // cell_line - add highlighted to selection - addHighlighted(); - cell_line.setAttribute("start", ""); - } - } - drawSelection(); - } - } - } - - // Drag actions - function dragstarted() { - var redraw = 0; - var x0 = d3.event.x, - y0 = d3.event.y, - c0 = diagram.find(x0, y0).index, - c1 = c0; - var mode = selection.indexOf(c0); - d3.event.on("drag", function() { - var x1 = d3.event.x, - y1 = d3.event.y, - c2 = diagram.find(x1, y1).index; - if (c2 !== c1 && journeyStep == 1) { - c1 = c2; - status = map_mode.getAttribute("status"); - if (status == 2) { - var state = selection.indexOf(c2); - if (mode == -1 && state == -1) { - selection.push(c2); - drawSelection(); - } else if (mode != -1 && state != -1) { - selection.splice(state, 1); - drawSelection(); - } - } else if (status == 1) { - var power = +$("#change_power").text(); - if ($("#draw_increase").attr("status") == 1) {polygons[c2].height += power;} - if ($("#draw_decrease").attr("status") == 1) {polygons[c2].height -= power;} - if ($("#draw_align").attr("status") == 1) {polygons[c2].height = polygons[c0].height;} - if ($("#draw_erase").attr("status") == 1) {polygons[c2].height = 0;} - if ($("#draw_smooth").attr("status") == 1) { - var heights = [polygons[c2].height]; - polygons[c2].neighbors.forEach(function(e) {heights.push(polygons[e].height);}); - polygons[c2].height = d3.mean(heights); - } - ; - highlighting.push(c2); - highlighting.map(function(h) { - highlighted.append("path").attr("d", "M" + polygons[h].join("L") + "Z"); - }); - redraw = 1; - } - } - }).on("end", function() { - if (redraw == 1) { - drawHeightmap(); - mockCoastline(); - highlighting = []; - highlighted.selectAll("*").remove(); - } - }); - } - - function dragCloudstarted() { - var angle, winds; - d3.event.on("drag", function() { - var x = d3.event.x; - var y = d3.event.y + 20; - x = Math.max(40, Math.min(mapWidth-40, x)); - y = Math.max(40, Math.min(mapHeight, y)); - angle = Math.atan2(mapHeight / 2 - y, mapWidth / 2 - x); - cloud.selectAll("text").attr("x", x).attr("y", y); - var arrow = cloud.selectAll("#cloudArrow").node().getBBox(); - var arrowX = arrow.x + arrow.width / 2; - var arrowY = arrow.y + arrow.height / 2; - degree = angle * 180 / Math.PI; - var azimuth = degree; - if (degree < 0) {azimuth = 360 + degree;} - if (azimuth >= 90) {azimuth -= 90;} else {azimuth += 270;} - winds = parseWinds(degree); - hintbar.innerHTML = "Prevailing winds: " + winds + " (" + Math.floor(azimuth) + "º)"; - cloud.selectAll("#cloudArrow").attr("transform", "rotate("+degree+" "+arrowX+" "+arrowY+")"); - }).on("end", function() { - simulateWind(angle, winds); - }); - } - - function parseWinds(d) { - if (d > 40 && d <= 140) {return "North";} - if (d > 140 && d < 160) {return "North-East";} - if (Math.abs(d) >= 160) {return "East";} - if (d > -160 && d < -140) {return "South-East";} - if (d > -140 && d <= -40) {return "South";} - if (d > -40 && d < -20) {return "South-West";} - if (Math.abs(d) <= 20) {return "West";} - if (d > 20 && d < 40) {return "North-West";} - } - - function addHighlighted() { - highlighting.map(function(i) { - if (selection.indexOf(i) == -1) {selection.push(i);} - }); - highlighted.selectAll("*").remove(); - highlighting = []; - } - - function clear() { - console.log("----------"); - svg.transition().duration(3000).call(zoom.transform, d3.zoomIdentity); - // Remove all on regenerate - container.selectAll("path").remove(); - debug.selectAll("circle").remove(); - //debug.selectAll("text").remove(); - defs.selectAll("path").remove(); - } - - // Random map - $("#new_random").click(function() { - clear(); - newRandomMap(); - }); - - // Random map Routine - function newRandomMap() { - console.time(" RandomMap"); - base.transition().duration(3000).attr("fill", "#5167a9"); - $("#explore").text("Explore the Map"); - calculateVoronoi(samples); - detectNeighbors(); - generateHeightmap(); - markFeatures(); - drawOcean([-6,-3,-1], ["#5E78B6","#6d8cc5","#7EABD5"]); - reGraph(); - collectStats(); - addNoise(); - applyNoise(); - //randomizePrecipitation(); - //calculatePrecipitation(); - unifyPrecipitation(); // temp - resolveDepressions(); - //downcutRivers(); - drawCoastline(); - //defineBiomes(); - drawMapBase(); - console.timeEnd(" RandomMap"); - } - - // Select Heighmap Template - function generateHeightmap() { - console.time("generateHeightmap"); - var rnd = Math.random(); - if (rnd > 0.8) {templateHighIsland();} - if (rnd > 0.55 && rnd <= 0.8) {templateLowIsland();} - if (rnd > 0.3 && rnd <= 0.55) {templateIsles();} - if (rnd > 0.05 && rnd <= 0.3) {templateArchipelago();} - if (rnd <= 0.05) {templateAtoll();} - downgradeBorders(); - smoothOcean(); - console.timeEnd("generateHeightmap"); - } - -// Heighmap Template: High Island - function templateHighIsland() { - mapTemplate = "High Island"; - addMountain(); - modifyHeights("all",0.04,0.9); - addHill(8, 0.4); - addHill(8, 0.33); - addRange(-2); - addPit(3); - modifyHeights("land",0,0.6); - addRange(2); - } - -// Heighmap Template: Low Island - function templateLowIsland() { - mapTemplate = "Low Island"; - addMountain(); - modifyHeights("all",0.03,0.9); - addHill(8, 0.4); - addHill(8, 0.33); - addRange(-2); - addPit(3); - modifyHeights("land",0,0.3); - } - - // Heighmap Template: Continental Islands - function templateIsles() { - mapTemplate = "Continental Islands"; - addMountain(); - addHill(14, 0.25); - addRange(-5); - modifyHeights("land",0,0.9); - } - - // Heighmap Template: Archipelago - function templateArchipelago() { - mapTemplate = "Archipelago"; - addMountain(); - modifyHeights("land",-0.2,1); - addHill(15, 0.15); - addRange(-2); - addPit(8); - modifyHeights("land",-0.05,0.9); - } - - // Heighmap Template: Atoll - function templateAtoll() { - mapTemplate = "Atoll"; - addMountain(); - addHill(8, 0.4); - modifyHeights("land",0.1,1); - var frontier = []; - polygons.map(function(i) { - if (i.height) { - var heights = [i.height]; - i.neighbors.forEach(function(e) {heights.push(polygons[e].height);}); - i.height = d3.mean(heights); - } - }); - polygons.map(function(i) { - if (i.height < 0.18) {i.height -= 0.06;} - if (i.height > 0.21) {i.height = 0.17;} - if (i.height >= 0.18 && Math.random() > 0.2) { - i.height = 0.20 * (Math.random() * 0.1 + 1); - frontier.push(i.index); - } - }); - var change = 0.05; - var used = frontier.slice(); - while (change > 0.01) { - var queue = []; - change -= 0.01 * (Math.random() * 0.4 + 0.8); - frontier.map(function(i) { - polygons[i].neighbors.forEach(function(e) { - if (used.indexOf(e) == -1) { - used.push(e); - queue.push(e); - polygons[e].height += change * (Math.random() * 0.2 + 0.9); - } - }); - frontier = queue.slice(); - }); - } - } - - // recalculate Voronoi Graph to relax Ocean and pack coast cells - function reGraph() { - console.time("reGraph"); - var points = [], data = []; - var coastal = $.grep(polygons, function(e) {return (e.type == 1 || e.type == -1);}); - console.log("coastal polygons: " + coastal.length); - polygons.map(function(i) { - //debug.append("text").attr("x", i.data[0]).attr("y", i.data[1]).attr("font-size", 2).attr("fill", "black").text(i.type); - if (i.type == 1 || i.type == -1) { - var x0 = i.data[0]; - var y0 = i.data[1]; - points.push([x0, y0]); - data.push({height:i.height, type:i.type, feature:i.feature, number:i.featureNumber}); - //if (i.type == -1) {debug.append("circle").attr("cx", x0).attr("cy", y0).attr("r", 0.3).attr("fill", "white");} - // add new points - i.neighbors.forEach(function(e) { - if (polygons[e].type == i.type) { - var x1 = Math.ceil((x0 * 2 + polygons[e].data[0]) / 3 - 0.5 + Math.random()); - var y1 = Math.ceil((y0 * 2 + polygons[e].data[1]) / 3 - 0.5 + Math.random()); - var copy = $.grep(points, function(e) {return (e[0] == x1 && e[1] == y1);}); - if (!copy.length) { - points.push([x1, y1]); - data.push({height:i.height, type:i.type, feature:i.feature, number:i.featureNumber}); - //if (i.type == -1) {debug.append("circle").attr("cx", x1).attr("cy", y1).attr("r", 0.3).attr("fill", "white");} - } - }; - }); - } else if (i.height >= 0.20) { - points.push([i.data[0], i.data[1]]); - data.push({height:i.height, type:i.type, feature:i.feature, number:i.featureNumber}); - } - }); - calculateVoronoi(points); - polygons.map(function(i, d) { - i.index = d; - i.height = data[d].height; - i.type = data[d].type; - i.feature = data[d].feature; - i.featureNumber = data[d].number; - i.precipitation = 0; - var neighbors = []; // re-detect neighbors - diagram.cells[d].halfedges.forEach(function(e) { - var edge = diagram.edges[e], ea; - if (edge.left && edge.right) { - ea = edge.left.index; - if (ea === d) {ea = edge.right.index;} - neighbors.push(ea); - } - }) - i.neighbors = neighbors; - }); - //findCells(points); - console.timeEnd("reGraph"); - } - - // collect and display map stats - function collectStats() { - console.log(" Map stats:"); - var land = $.grep(polygons, function(e,d) {return (e.height >= 0.2);}); - var landmass = Math.floor(land.length / polygons.length * 100); - var heights = []; - land.map(function(i) {heights.push(i.height);}); - var avElevation = d3.mean(heights); - console.log(" Heighmat template: "+mapTemplate) - console.log(" Polygons initial: "+samples.length); - console.log(" Polygons repacked: "+polygons.length); - console.log(" Land / Ocean polygons: "+land.length+"/"+(polygons.length-land.length)); - console.log(" Average land elevation: "+avElevation.toFixed(2)); - } - - // Downgrade near-border cells (prevent non-island formation errors) - function downgradeBorders() { - var borderCells = $.grep(polygons, function(e) {return (e.type == -99);}); - borderCells.map(function(i) { - i.neighbors.forEach(function(e) {polygons[e].height = 0;}); - }); - } - - // Smooth Ocean - function smoothOcean() { - var frontier = $.grep(polygons, function(e) {return (e.type === -1);}); - for (var c = -2; frontier.length > 0 && c > -6; c--) { - frontier.map(function(i) { - polygons[i.index].height = 0.2 + (c+1)/50; - i.neighbors.forEach(function(e) { - if (!polygons[e].type && polygons[e].height < 0.2) {polygons[e].type = c;} - }); - }); - frontier = $.grep(polygons, function(e) {return (e.type === c);}); - } - } - - // Modify heights multiplying/adding by value - function modifyHeights(type, add, mult) { - polygons.map(function(i) { - if (type === "land") { - if (i.height >= 0.2) { - i.height += add; - var dif = i.height - 0.2; - var factor = mult; - if (mult == "^2") {factor = dif} - if (mult == "^3") {factor = dif * dif;} - i.height = 0.2 + dif * factor; - } - } - if (type === "ocean") { - if (i.height < 0.2 && i.height > 0) { - i.height += add; - i.height *= mult; - } - } - if (type === "all") { - if (i.height > 0) { - i.height += add; - i.height *= mult; - } - } - }); - } - - // Explore map - $("#explore").click(function() { - zoom.on("zoom", zoomed); - container.transition().duration(3000).attr("transform", "translate(0 0)"); - svg.select("#rose").transition().duration(3000).attr("transform", "translate(75 75) scale(0.2)"); - if (journeyStep == 0) { - $("#initial, #rose").fadeOut(); - $("#toolbar, #hintbar").fadeIn(); - journeyStep = 1; - $("#toolbar_step1").fadeIn(); - hintbar.innerHTML = stepHint[journeyStep]; - } else if (journeyStep == -1) { - $("#initial").fadeOut(); - } - }); - - // New Journey - $("#new_journey").click(function() { - zoom.on("zoom", zoomed); - journeyStep = 1; - d3.select(".mottling").attr("display", "none"); - $("#initial, #rose").fadeOut(); - $("#toolbar, #hintbar").fadeIn(); - $("#toolbar_step1").fadeIn(); - base.transition().duration(3000).attr("fill", "#5e4fa2"); - svg.append("text").text(stepName[journeyStep]).attr("class", "step") - .attr("x", mapWidth/6).attr("y", mapHeight/3).transition() - .duration(3000).style("font-size", "50px").style("fill-opacity", 1) - .transition().delay(1000) - .duration(2500).style("font-size", "0px").style("fill-opacity", 0) - .remove(); - clear(); - calculateVoronoi(samples); - detectNeighbors(); - hintbar.innerHTML = stepHint[journeyStep]; - container.attr("transform", "translate(0 0)"); - noiseApplied = false; - $("#precN").attr("prec", 0); - $("#precE").attr("prec", 0); - $("#precS").attr("prec", 0); - $("#precW").attr("prec", 0); - //toggleGrid(); - }); - - // Journey Move back - function back() { - $(".step_buttons").fadeOut(); - if (journeyStep == -1) { - $("#initial").fadeIn(); - } else if (journeyStep == 0) { - $("#initial, #rose").fadeOut(); - $("#toolbar, #hintbar").fadeIn(); - hintbar.innerHTML = stepHint[journeyStep]; - } else if (journeyStep == 1) { - $("#new_journey").text("New Journey"); - $("#explore").text("Back to Journey"); - $("#initial").fadeIn(); - $("#toolbar, #hintbar").fadeOut(); - } - journeyStep--; - $("#toolbar_step"+journeyStep).toggle(); - } - - // Journey Move forward - function next() { - if (hCells.selectAll("*").size()) { - journeyStep++; - $(".step_buttons").hide(); - $("#toolbar_step"+journeyStep).toggle(); - svg.append("text").text(stepName[journeyStep]).attr("class", "step") - .attr("x", mapWidth/6).attr("y", mapHeight/3).transition() - .duration(3000).style("font-size", "50px").style("fill-opacity", 1) - .transition().delay(1000).duration(2500).style("font-size", "0px") - .style("fill-opacity", 0).remove(); - if (journeyStep == 2) { - viewbox.on(".drag", null); - $(".container").fadeOut("slow"); - coastline.selectAll("*").remove(); - hCells.selectAll("*").remove(); - markFeatures(); - drawOcean([-6,-3,-1], ["#5E78B6","#6d8cc5","#7EABD5"]); - reGraph(); - if (noiseApplied == false) {addNoise();} - drawCoastline(); - drawMapBase(); - $(".container").fadeIn("slow"); - } - } else { - hintbar.innerHTML = "You have to define landmass first!"; - } - } - - // Toolbar buttons handler - $(".toolbar_button").click(function() { - var button = $(this).attr('id'); - var parentButton = $(this).parent().attr('id'); - if (button == "map_mode") { - var status = map_mode.getAttribute("status"); - if (status == -1) { - map_mode.setAttribute("status", 0); - $("#map_mode").text("♒"); - $("#map_mode_rand").show(); - hintbar.innerHTML = "Random mode: place a feature at a random point"; - } else if (status == 0) { - map_mode.setAttribute("status", 1); - $("#map_mode").text("✏"); - $("#map_mode_rand").hide(); - $("#map_mode_draw").show(); - viewbox.call(drag); - hintbar.innerHTML = "Free Draw mode: click or drag to directly change cell heights"; - } else if (status == 1) { - map_mode.setAttribute("status", 2); - $("#map_mode").text("➚"); - $("#map_mode_draw").hide(); - $("#map_mode_selection").show(); - hintbar.innerHTML = "Selection mode: click or drag to select cells"; - } else if (status == 2) { - map_mode.setAttribute("status", -1); - $("#map_mode").text("☸"); - $("#map_mode_selection").hide(); - hintbar.innerHTML = "Click to change the mode of operation"; - viewbox.on(".drag", null); - } - } - if (parentButton == "map_mode_draw") {$("#map_mode_draw > div").attr("status", 0)} - if (button == "draw_increase") {$("#draw_increase").attr("status", 1);} - if (button == "draw_decrease") {$("#draw_decrease").attr("status", 1);} - if (button == "draw_align") {$("#draw_align").attr("status", 1);} - if (button == "draw_erase") {$("#draw_erase").attr("status", 1);} - if (button == "draw_smooth") {$("#draw_smooth").attr("status", 1);} - if (button == "map_clear") { - clear(); - polygons.map(function(i) {i.height = 0;}); - cell_cancel.click(); - } - if (button == "cell_expand") { - var list = selection.slice(); - list.map(function(i) { - polygons[i].neighbors.forEach(function(e) { - if (selection.indexOf(e) == -1) { - selection.push(e); - } - }); - }); - drawSelection(); - } - if (button == "cell_line") { - highlighted.selectAll("*").remove(); - highlighting = []; - if (cell_line.getAttribute("start") == "") { - var cell = +selection[selection.length-1]; - cell_line.setAttribute("start", cell); - hintbar.innerHTML = "Click to set selection end cell"; - } else { - cell_line.setAttribute("start", ""); - hintbar.innerHTML = "Select line of cells"; - } - drawSelection(); - } - if (button == "cell_cancel") { - selection = []; - $("#cellMenu").hide(); - cell_line.setAttribute("start", ""); - selected.selectAll("*").remove(); - highlighted.selectAll("*").remove(); - } - if (parentButton == "map_mode_rand") { - if (button == "rand_hill") {addHill(1, 0.25);} - if (button == "rand_range") {addRange(1);} - if (button == "rand_pit") {addPit(1);} - if (button == "rand_trough") {addRange(-1);} - drawHeightmap(); - mockCoastline(); - } - if (button == "map_up" || button == "map_down") { - var change = +$("#change_power").text(); - var mod = 1; - if (button == "map_down") {mod = -1;} - if (selection.length > 0) { - var used = selection.slice(); - var frontier = selection.slice(); - frontier.map(function(i) {polygons[i].height += change * mod * (Math.random() * 0.2 + 0.9);}); - while (change > 0.01) { - var queue = []; - change -= 0.01 * (Math.random() * 0.4 + 0.8); - frontier.map(function(i) { - polygons[i].neighbors.forEach(function(e) { - if (used.indexOf(e) == -1) { - used.push(e); - queue.push(e); - polygons[e].height += change * mod * (Math.random() * 0.2 + 0.9); - } - }); - frontier = queue.slice(); - }); - } - drawHeightmap(); - } else { - drawHeightmap(change * mod); - } - mockCoastline(); - } - if (button == "change_power") { - if ($("#change_power").text() == ".01") { - $("#change_power").text(".05"); - } else if ($("#change_power").text() == ".05") { - $("#change_power").text(".10"); - } else { - $("#change_power").text(".01"); - } - } - if (button == "map_relax") { - if (selection.length > 0) { - selection.map(function(i) { - var heights = [polygons[i].height]; - polygons[i].neighbors.forEach(function(e) {heights.push(polygons[e].height);}); - var mean = d3.mean(heights); - polygons[i].height = (polygons[i].height * 3 + mean) / 4; - }); - } else { - polygons.map(function(i) { - if (i.height > 0) { - var heights = [i.height]; - i.neighbors.forEach(function(e) {heights.push(polygons[e].height);}); - var mean = d3.mean(heights); - i.height = (i.height * 3 + mean) / 4; - } - }); - } - drawHeightmap(); - mockCoastline(); - } - if (button == "map_random") { - if (selection.length > 0) { - selection.map(function(i) { - if (polygons[i].height > 0) { - var power = +$("#change_power").text(); - var value = Math.random() * power; - var mod = 1; - if (Math.random() > 0.5) {mod = -1;} - if (polygons[i].height < 0.2) {value /= 10;} - polygons[i].height += value * mod; - } - }); - } else { - polygons.map(function(i) { - if (i.height > 0) { - var power = +$("#change_power").text(); - var value = Math.random() * power; - var mod = 1; - if (Math.random() > 0.5) {mod = -1;} - if (i.height < 0.2) {value /= 10;} - i.height += value * mod; - } - }); - } - drawHeightmap(); - mockCoastline(); - } - if (button == "map_template") { - $("#map_template_buttons").toggle(); - if ($("#map_template_buttons").is(':visible')) { - $("#toolbar").css("border-radius", "0 0 4px 0"); - } else { - $("#toolbar").css("border-radius", "0 4px 4px 0"); - } - } - if (button == "map_noise") {$("#map_noise_buttons").toggle();} - if (button == "map_style") {$("#map_style_buttons").toggle();} - if (button == "map_rand") {$("#map_rand_buttons").toggle();} - if (parentButton == "map_template_buttons") { - clear(); - polygons.map(function(i) {i.height = 0; i.type = undefined;}); - cell_cancel.click(); - if (button == "temp_high_island") {templateHighIsland();} - if (button == "temp_low_island") {templateLowIsland();} - if (button == "temp_isles") {templateIsles();} - if (button == "temp_archipelago") {templateArchipelago();} - if (button == "temp_atoll") {templateAtoll();} - polygons.map(function(i) {if (i.height < 0.2) {i.height = 0}}); - downgradeBorders(); - mockCoastline(); - smoothOcean(); - drawHeightmap(); - } - - if (button == "generate_noise") { - addNoise(); - showNoise(); - } - if (button == "apply_noise") { - applyNoise(); - noiseApplied = true; - drawHeightmap(); - mockCoastline(); - } - if (button == "cancel_noise") { - drawHeightmap(); - mockCoastline(); - } - if (parentButton == "map_style_buttons") { - mapStyle.value = button; - drawMapBase(); - } - if (button == "map_wind") { - cancelAnimationFrame(animation); - animated = false; - if ($("#main").length) {$("#canvasContainer").empty();} - $("#map_wind_buttons, .cloud").toggle(); - } - if (button == "resetZoom") {svg.transition().duration(1000).call(zoom.transform, d3.zoomIdentity);} - if (button == "back") {back();} - if (button == "next") {next();} - }); - - // Change hint on button mouseover - $(".toolbar_button, .cellMenu_button").mouseover(function() { - var button = $(this).attr("id"), hint; - // step 1 - if (button == "map_mode") { - var status = map_mode.getAttribute("status"); - if (status == 1) { - hint = "Free Draw mode: click or drag to directly change cell heights"; - } else if (status == 2) { - hint = "Selection mode: click or drag to select cells"; - } else { - hint = "Random mode: place a feature at a random point"; - } - } - if (button == "map_template") {hint = "Apply formation template (current heightmap will be lost)";} - if (button == "temp_high_island") {hint = "Apply High (Volcanic) Island formation template (overwrite current map)";} - if (button == "temp_low_island") {hint = "Apply Low Island formation template (overwrite current map)";} - if (button == "temp_isles") {hint = "Apply Continental Islands formation template (overwrite current map)";} - if (button == "temp_archipelago") {hint = "Apply Archipelago formation template (overwrite current map)";} - if (button == "temp_atoll") {hint = "Apply Atoll formation template (overwrite current map)";} - if (button == "change_power") {hint = "Change brush power";} - - if (button == "draw_increase") {hint = "Increase height by brush power";} - if (button == "draw_decrease") {hint = "Decrease height by brush power";} - if (button == "draw_align") {hint = "Spread the clicked cell height";} - if (button == "draw_erase") {hint = "Set cell height to zero";} - if (button == "draw_smooth") {hint = "Smooth by taking neigbours cells mean height";} - if (button == "map_clear") {hint = "Clear the map (all the data will be lost!)";} - - if (button == "map_up") {hint = "Decrease selection height";} - if (button == "map_down") {hint = "Increase selection height";} - if (button == "map_relax") {hint = "Smooth the selection";} - if (button == "map_random") {hint = "Randomize the selection";} - if (button == "map_noise") {hint = "Overlay with random noise layer";} - if (button == "map_rand") {hint = "Randomly Place a feature";} - if (button == "rand_hill") {hint = "Place a random Hill";} - if (button == "rand_range") {hint = "Place a random Range";} - if (button == "rand_pit") {hint = "Place a random Pit";} - if (button == "rand_trough") {hint = "Place a random Trough";} - // step 2 - if (button == "map_temp") {hint = "Set average annual temperature. Temperature depends this value and land altitude";} - if (button == "map_wind") {hint = "Toggle wind map. Drag the Cloud to set a prevailing winds";} - if (button == "map_style") {hint = "Select base map rendering style";} - if (button == "map_polygonal") {hint = "Polygonal map rendering style";} - if (button == "map_noisy") {hint = "Noisy map rendering style";} - if (button == "map_relaxed") {hint = "Relaxed map rendering style";} - if (button == "map_contours") {hint = "Contours map rendering style";} - if (button == "map_triangled") {hint = "Triangled map rendering style";} - if (button == "map_shaded") {hint = "Shaded map rendering style";} - if (button == "map_flat") {hint = "Flat map rendering style";} - // general buttons - if (button == "resetZoom") {hint = "Restore default zoom";} - if (button == "download") {hint = "Save map in SVG";} - if (button == "back") {hint = "Back to the previous step";} - if (button == "next") {hint = "Go to the next step";} - // cell buttons - if (button == "cell_expand") {hint = "Expand the selection";} - if (button == "cell_line") {hint = "Select line of cells";} - if (button == "cell_cancel") {hint = "Deselect all cells";} - hintbar.innerHTML = hint; - }).mouseout(function() { - hintbar.innerHTML = stepHint[journeyStep]; - }); - - // redraw map on options change - $("#mapStyle, #mapColor, #mapType").change(function() { - drawMapBase(); - }); - - // recalculate Temperature and redraw map on option change - $("#temperatureInput").change(function() { - defineBiomes(); - drawMapBase(); - }); - - // Change Initial Precipitation on cloud click (journey step 2) - function changePrec() { - var prec = +$(this).attr("prec"); - prec++; - if (prec>5) {prec=0;} - $(this).attr("prec", prec); - $(this).attr("fill", blue(prec/6)); - var text = "Click to change the fainfall power. Current value: "; - hintbar.innerHTML = text + prec; - updatePrec(); - } - - // Show hint on Cloud mousemove (journey step 2) - function changePrecHint() { - var prec = +$(this).attr("prec"); - var text = "Click to change the fainfall power. Current value: "; - hintbar.innerHTML = text + prec; - } - - // recalculate Precipitation and redraw map on option change - function updatePrec() { - riversShade.selectAll("path").remove(); - rivers.selectAll("path").remove(); - polygons.map(function(i) { - i.precipitation = 0; - i.flux = undefined; - i.river = undefined; - }) - calculatePrecipitation(); - //defineBiomes(); - } - - // redraw coastline on coast style change - $("#coastStyle").change(function() { - drawCoastline(); - }); - - // Draw of remove blur polygons on input change - $("#blurInput").change(function() { - if (blurInput.checked == true) { - d3.selectAll(".mapCells") - .attr("filter", "url(#blurFilter)"); - } else { - d3.selectAll(".mapCells") - .attr("filter", ""); - } - }); - - // Switch map color scheme - function switchColor() { - d3.selectAll(".blur").remove(); - if (blurInput.valueAsNumber > 0) { - var limit = 0.2; - if (seaInput.checked == true) { - limit = 0; - } - polygons.map(function(i) { - if (i.height >= limit) { - mapCells.append("path") - .attr("d", "M" + i.join("L") + "Z") - .attr("class", "blur") - .attr("stroke-width", blurInput.valueAsNumber) - .attr("stroke", bright(1 - i.height)); - } - }); - } - } - - // Toggle polygons strokes on input change - $("#strokesInput").change(function() { - toggleGrid(); - }); - - function toggleGrid() { - if (grid.selectAll("*").empty()) { - var d = ""; - polygons.map(function(i) { - d += "M" + i.join("L") + "Z"; - }); - grid.append("path").attr("d", d); - } else { - grid.selectAll("*").remove(); - } - } - - // Toggle precipitation map - $("#fluxInput").change(function() { - if (fluxInput.checked == true) { - polygons.map(function(i) { - if (i.height >= 0.2) { - mapCells.append("path") - .attr("d", "M" + i.join("L") + "Z") - .attr("stroke", blue(i.precipitation)) - .attr("fill", blue(i.precipitation)) - .attr("class", "flux"); - } - }); - } else { - d3.selectAll(".flux").remove(); - } - }); - - // Toggle slope hatching - $("#hatchingInput").change(function() { - if (hatchingInput.checked == true) { - console.time("slopeHatching"); - d3.range(0, mapHeight).forEach(function(y) { - d3.range(0, mapWidth).forEach(function(x) { - var point = x + y * mapWidth; - var height = pointsHeights[point]; - if (height >= 0.2) { - var delta = pointsHeights[point] - pointsHeights[point-1]; - if (Math.abs(delta) > 0.05) { - var dx = x - 0.4 + Math.random() * 0.8; - var dy = y - 0.4 + Math.random() * 0.8; - var l = Math.abs(delta) * 50; - var h = delta * -10 * height; - if (l > 1) {l =1;} - if (l < 0.5) {l = 0.5;} - if (h > 0.4) {h = 0.4;} - if (h < -0.4) {h = -0.4;} - var d = dx+" "+dy+" l"+l+" "+h; - hatching.append("path").attr("d", "M" + d + "Z"); - } - } - }); - }); - console.timeEnd("slopeHatching"); - } else { - hatching.selectAll("path").remove(); - } - }); - - // Descrease or increase land - function elevateLand(mod) { - polygons.map(function(i) { - if (i.height >= 0.2) {i.height += mod;} - }); - } - - function downcutRivers() { - console.time("downcutRivers"); - var downcut = downcuttingInput.valueAsNumber; - polygons.map(function(i) { - if (i.flux >= 0.85 && i.height >= 0.21) { - i.height -= downcut / 10; - } - }); - console.timeEnd("downcutRivers"); - } - - function randomizePrecipitation() { - var total = 0; - function rndPrec() { - if (Math.random() > 0.2) { - var prec = Math.floor(Math.random() * 12) + 6; - } else { - var prec = Math.floor(Math.random() * 18) + 2; - } - return prec; - } - Math.random() >= 0.75 ? prec = rndPrec() : prec = 0; - $("#precN").attr("prec", prec); - total = prec; - Math.random() >= 0.75 ? prec = rndPrec() : prec = 0; - $("#precE").attr("prec", prec); - total += prec; - Math.random() >= 0.75 ? prec = rndPrec() : prec = 0; - $("#precS").attr("prec", prec); - total += prec; - Math.random() >= 0.75 ? prec = rndPrec() : prec = 0; - $("#precW").attr("prec", prec); - total += prec; - if (total == 0) {$("#precW").attr("prec", 12)} - } - - function calculatePrecipitation() { - console.time("calculatePrecipitation"); - var precN = +$("#precN").attr("prec"); - var precE = +$("#precE").attr("prec"); - var precS = +$("#precS").attr("prec"); - var precW = +$("#precW").attr("prec"); - if (precN > 0) { - var frontier = $.grep(polygons, function(e) { - return (e.data[1] < precN * 10 && e.data[0] > mapWidth*0.1 && e.data[0] < mapWidth*0.9); - }); - frontier.map(function(i) { - var x = i.data[0], y = i.data[1]; - var precipitation = precN; - while (y < mapHeight * 0.9 && precipitation > 0) { - y += 10; - x += Math.floor(Math.random() * 20 - 10); - precipitation = rainfall(x, y, precipitation); - } - }); - } - if (precE > 0) { - var frontier = $.grep(polygons, function(e) { - return (e.data[0] * 10 > mapWidth-precE && e.data[1] > mapHeight*0.1 && e.data[1] < mapHeight*0.9); - }); - frontier.map(function(i) { - var x = i.data[0], y = i.data[1]; - var precipitation = precE; - while (x > mapWidth * 0.1 && precipitation > 0) { - x -= 10; - y += Math.floor(Math.random() * 20 - 10); - precipitation = rainfall(x, y, precipitation); - } - }); - } - if (precS > 0) { - var frontier = $.grep(polygons, function(e) { - return (e.data[1] * 10 > mapHeight-precS && e.data[0] > mapWidth*0.1 && e.data[0] < mapWidth*0.9); - }); - frontier.map(function(i) { - var x = i.data[0], y = i.data[1]; - var precipitation = precS; - while (y > mapHeight * 0.1 && precipitation > 0) { - y -= 10; - x += Math.floor(Math.random() * 20 - 10); - precipitation = rainfall(x, y, precipitation); - } - }); - } - if (precW > 0) { - var frontier = $.grep(polygons, function(e) { - return (e.data[0] * 10 < precW && e.data[1] > mapHeight*0.1 && e.data[1] < mapHeight*0.9); - }); - frontier.map(function(i) { - var x = i.data[0], y = i.data[1]; - var precipitation = precW; - while (x < mapWidth * 0.9 && precipitation > 0) { - x += 10; - y += Math.floor(Math.random() * 20 - 10); - precipitation = rainfall(x, y, precipitation); - } - }); - } - // Smooth precipitation by taking average values of all neighbors - polygons.map(function(i) { - if (i.height >= 0.2) { - var prec = [i.precipitation]; - i.neighbors.forEach(function(e) { - prec.push(polygons[e].precipitation); - }); - var mean = d3.mean(prec); - if (i.precipitation < mean) { - i.precipitation = mean; - } - i.flux = i.precipitation; - if (i.precipitation < 0.01) { - i.precipitation = 0.01; - } - } - }); - console.timeEnd("calculatePrecipitation"); - } - - function rainfall(x, y, precipitation) { - if (x < 0) {x = 0;} - if (y < 0) {y = 0;} - if (x >= mapWidth) {y = mapWidth-1;} - if (y >= mapHeight) {y = mapHeight-1;} - var height = pointsHeights[x + y * mapWidth]; - if (height >= 0.2) { - var cell = pointsCells[y][x]; - if (height < 0.6) { - var rain = Math.random() * height; - precipitation -= rain; - polygons[cell].precipitation += rain; - } else { - precipitation = 0; - polygons[cell].precipitation += precipitation; - } - } - return precipitation; - } - - function unifyPrecipitation() { - polygons.map(function(i) { - if (i.height >= 0.2) { - i.flux = 0.1; - i.precipitation = 0.3; - } - }); - } - - function resolveDepressions() { - console.time('resolveDepressions'); - land = $.grep(polygons, function(e) { - return (e.height >= 0.2); - }); - var depression = 1, minCell, minHigh; - while (depression > 0) { - depression = 0; - for (var i = 0; i < land.length; i++) { - minHigh = 10; - land[i].neighbors.forEach(function(e) { - if (polygons[e].height < minHigh) { - minHigh = polygons[e].height; - minCell = e; - } - }); - if (land[i].height <= polygons[minCell].height) { - depression += 1; - land[i].height = polygons[minCell].height + 0.01; - } - } - } - land.sort(compareHeight); - console.timeEnd('resolveDepressions'); - flux(); - } - - function compareHeight(a, b) { - if (a.height < b.height) return 1; - if (a.height > b.height) return -1; - return 0; - } - - function compareOrder(a, b) { - if (a.order < b.order) return 1; - if (a.order > b.order) return -1; - return 0; - } - - function sortNumber(a, b) { - return a - b; - } - - function flux() { - console.time('flux'); - riversData = []; - var riversOrder = [], confluence = []; - var oposite, riverNext = 0; - for (var i = 0; i < land.length; i++) { - var pour = [], id = land[i].index; - var min, minHeight = 1; - diagram.cells[id].halfedges.forEach(function(e) { - var edge = diagram.edges[e]; - var ea = edge.left.index; - if (ea === id || !ea) { - ea = edge.right.index; - } - if (ea) { - if (polygons[ea].height < minHeight) { - min = ea; - minHeight = polygons[ea].height; - } - // Define neighbour ocean cells for deltas - if (polygons[ea].height < 0.2) { - var xDiff = (edge[0][0] + edge[1][0]) / 2; - var yDiff = (edge[0][1] + edge[1][1]) / 2; - pour.push({x:xDiff, y:yDiff, cell:ea}); - } - } - }) - // Define river number - if (!land[i]) {console.log("- Land cell is undefined!")} - if (land[i].flux > 0.85) { - if (!land[i].river) { - // State new River - land[i].river = riverNext; - var rnd = Math.random() / 1000; - riversOrder.push({r: riverNext, order: rnd}); - riversData.push({river: riverNext, - cell: id, x: land[i].data[0], - y: land[i].data[1], type: "source"}); - riverNext += 1; - } - // Assing existing River to the downhill cell - if (!polygons[min].river) { - polygons[min].river = land[i].river; - } else { - var riverTo = polygons[min].river; - var iRiver = $.grep(riversData, function(e) { - return (e.river == land[i].river); - }); - var minRiver = $.grep(riversData, function(e) { - return (e.river == riverTo); - }); - var iRiverL = iRiver.length; - var minRiverL = minRiver.length; - // re-assing river nunber if new part is greater - if (iRiverL >= minRiverL) { - riversOrder[land[i].river].order += iRiverL; - polygons[min].river = land[i].river; - iRiverL += 1; - minRiverL -= 1; - } else { - if (!riversOrder[riverTo]) { - console.log("- Order Error!"); - riversOrder[riverTo] = []; - riversOrder[riverTo].order = minRiverL; - } else { - riversOrder[riverTo].order += minRiverL; - } - } - // mark confluences - if (polygons[min].height >= 0.2 && iRiverL > 1 && minRiverL > 1) { - if (iRiverL >= minRiverL) { - confluence.push({id: min, s: id, l: iRiverL, r: land[i].river}) - } - if (!polygons[min].confluence) { - polygons[min].confluence = 2; - var cellTo = minRiver[minRiverL-1].cell; - if (cellTo == min) { - cellTo = minRiver[minRiverL-2].cell; - } - confluence.push({id: min, s: cellTo, l: minRiverL-1, r: riverTo}) - } else { - polygons[min].confluence += 1; - } - if (iRiverL < minRiverL) { - confluence.push({id: min, s: id, l: iRiverL, r: land[i].river}) - } - } - } - } - polygons[min].flux += land[i].flux; - if (land[i].precipitation * 0.97> polygons[min].precipitation) { - polygons[min].precipitation = land[i].precipitation * 0.97 - } - if (land[i].river) { - if (polygons[min].height < 0.2) { - // pour water to the Ocean - if (land[i].flux > 14 && pour.length > 1 && !land[i].confluence) { - // River Delta - for (var c = 0; c < pour.length; c++) { - if (c == 0) { - riversData.push({river: land[i].river, - cell: id, x: pour[0].x, - y: pour[0].y, type: "delta", - pour: pour[0].cell}); - } else { - riversData.push({river: riverNext, - cell: id, x: land[i].data[0], - y: land[i].data[1], type: "course"}); - riversData.push({river: riverNext, - cell: id, x: pour[c].x, - y: pour[c].y, type: "delta", - pour: pour[0].cell}); - riverNext += 1; - } - } - } else { - // River Estuary - var x = pour[0].x+(pour[0].x-land[i].data[0])/10; - var y = pour[0].y+(pour[0].y-land[i].data[1])/10; - riversData.push({river: land[i].river, - cell: id, x: x, y: y, - type: "estuary", pour: pour[0].cell}); - } - } - else { - // add next River segment - riversData.push({river: land[i].river, - cell: min, x: polygons[min].data[0], - y: polygons[min].data[1], type: "course"}); - } - } - } - console.timeEnd('flux'); - riversOrder.sort(compareOrder); - drawRiverLines(riversOrder, confluence); - } - - function drawRiverLines(riversOrder, confluence) { - console.time('drawRiverLines'); - var dataRiver, x, y, line, side = 1, confAngles = []; - lineGen.curve(d3.curveCatmullRom.alpha(0.1)); - for (var i = 0; i < riversOrder.length; i++) { - dataRiver = $.grep(riversData, function(e) { - return (e.river == riversOrder[i].r); - }); - var order = riversOrder[i].r; - var riverAmended = []; - if (dataRiver.length > 1) { - if (dataRiver.length > 2 || dataRiver[1].type == "delta") { - // add more river points on 1/3 and 2/3 of length - for (var r = 0; r < dataRiver.length; r++) { - var dX = dataRiver[r].x; - var dY = dataRiver[r].y; - riverAmended.push({scX:dX, scY:dY}); - if (r+1 < dataRiver.length) { - var eX = dataRiver[r+1].x; - var eY = dataRiver[r+1].y; - var angle = Math.atan2(eY - dY, eX - dX); - if (dataRiver[r+1].type == "course") { - var meandr = 0.4 + Math.random() * 0.3; - var stX = (dX * 2 + eX) / 3; - var stY = (dY * 2 + eY) / 3; - var enX = (dX + eX * 2) / 3; - var enY = (dY + eY * 2) / 3; - if (Math.random() > 0.5) {side *= -1}; - stX += -Math.sin(angle) * meandr * side; - stY += Math.cos(angle) * meandr * side; - if (Math.random() > 0.6) {side *= -1}; - enX += Math.sin(angle) * meandr * side; - enY += -Math.cos(angle) * meandr * side; - riverAmended.push({scX:stX, scY:stY}); - riverAmended.push({scX:enX, scY:enY}); - } else { - var meandr = 0.2 + Math.random() * 0.1; - var mX = (dX + eX) / 2; - var mY = (dY + eY) / 2; - mX += -Math.sin(angle) * meandr * side; - mY += Math.cos(angle) * meandr * side; - riverAmended.push({scX:mX, scY:mY}); - } - } - } - } - var d = lineGen(riverAmended); - if (dataRiver[1].type == "delta") { - riversShade.append("path").attr("d", d).attr("stroke-width", 0.2); - rivers.append("path").attr("d", d).attr("stroke-width", 0.6); - } else { - var river = defs.append("path").attr("d", d); - var path = river.node().getPathData(); - var count = 1, width = 0; - for (var s = 1; s < path.length; s++) { - var segment = ""; - if (s == 1) { - var sX = path[0].values[0]; - var sY = path[0].values[1]; - } else { - var sX = path[s-1].values[4]; - var sY = path[s-1].values[5]; - } - var eX = path[s].values[4]; - var eY = path[s].values[5]; - var xn = eX, yn = eY; - var to = diagram.find(eX, eY, 0.01); - var riverWidth = (count + width * 3) / 50; - var curve = " C"+ path[s].values[0]+"," +path[s].values[1] + ", " + path[s].values[2]+"," +path[s].values[3]; - count += 1; - if (to) { - if (polygons[to.index].confluence) { - var confData = $.grep(confluence, function(e) { - return (e.id == to.index); - }); - if (s+1 !== path.length) { - var angle = Math.atan2(eY - path[s].values[3], eX - path[s].values[2]); - confAngles[to.index] = angle; - // Tributaries use Main Stem's angle and amended curve - var angle = confAngles[to.index]; - var midX = (path[s].values[0] + path[s].values[2]) / 2; - var midY = (path[s].values[1] + path[s].values[3]) / 2; - var curve = " C"+ path[s].values[0]+"," +path[s].values[1] + ", " + midX + "," + midY; - if (angle == undefined) { - // if tributary rendered before main stem only - var angle = Math.atan2(eY - path[s].values[3], eX - path[s].values[2]); - } - } - var flux = polygons[to.index].flux; - count = 0, width = Math.pow(flux, 0.9); - var df = (width * 3 / 50 - riverWidth) / 2; - var c1 = confData[0].s; - var c2 = confData[1].s; - var bX = (polygons[c1].data[0] + polygons[c2].data[0])/2; - var bY = (polygons[c1].data[1] + polygons[c2].data[1])/2; - var xl = -Math.sin(angle) * df + eX; - var yl = Math.cos(angle) * df + eY; - var xr = Math.sin(angle) * df + eX; - var yr = -Math.cos(angle) * df + eY; - var cross = ((bX-eX)*(sY-eY) - (bY-eY)*(sX-eX)); - if (cross > 0) { - xn = xr; - yn = yr; - } else { - xn = xl; - yn = yl; - } - } - } - segment += sX +","+sY + curve + "," + xn+"," +yn; - var shadowWidth = riverWidth/3; - if (shadowWidth < 0.1) {shadowWidth = 0.1;} - riversShade.append("path").attr("d", "M"+segment) - .attr("stroke-width", shadowWidth); - rivers.append("path").attr("d", "M"+segment) - .attr("stroke-width", riverWidth); - } - } - } - } - console.timeEnd('drawRiverLines'); - } - - function defineBiomes() { - console.time('defineBiomes'); - var temperature, temp, prec; - pointsBiomes = []; - if (randomTemp.checked) { - var rand = Math.random(); - if (rand > 0.5) { - temperature = Math.floor(Math.random() * 6) + 7; - } else if (rand > 0.2) { - temperature = Math.floor(Math.random() * 10) + 5; - } else { - temperature = Math.floor(Math.random() * 20); - } - temperatureInput.value = temperature; - temperatureOutput.value = temperature; - } else { - temperature = temperatureInput.value; - } - d3.range(0, mapHeight).forEach(function(y) { - d3.range(0, mapWidth).forEach(function(x) { - var height = pointsHeights[x + y * mapWidth]; - if (height >= 0.2) { - var cell = pointsCells[y][x]; - prec = getPrecipitation(polygons[cell].precipitation); - temp = Math.floor(polygons[cell].height * 100 - (temperature - 12) / 0.2); - if (temp > 99) {temp = 99;} // max value - if (temp < 0) {temp = 0;} // min value - pointsBiomes.push(biomIDs[prec][temp]); - } else { - pointsBiomes.push(-1); - } - }); - }); - polygons.map(function(i) { - if (i.height >= 0.2) { - var prec = getPrecipitation(i.precipitation); - var temp = Math.floor(i.height * 100 - (temperature - 12) / 0.2); - if (temp > 99) {temp = 99;} // max value - if (temp < 0) {temp = 0;} // min value - i.biom = biomIDs[prec][temp]; - i.biomColor = biomGrad[prec][temp]; - } - }); - console.timeEnd('defineBiomes'); - } - - // genearal update on mousemove - function moved() { - var point = d3.mouse(this), - x = Math.floor(point[0]), - y = Math.floor(point[1]), - i = diagram.find(x, y).index; - if (journeyStep == 1 && $("#map_mode").attr("status") > 0) { - cursored.selectAll("path").transition().duration(50).style("opacity", 0).remove(); - var d = "M" + polygons[i].join("L") + "Z"; - cursored.append("path").attr("d", d).attr("stroke", "white").attr("stroke-width", 0.3); - cursored.append("path").attr("d", d).attr("stroke", "black").attr("stroke-width", 0.1); - } - $("#cell").text(i); - $("#heightPoint").text(pointsHeights[x + y * mapWidth]); - if (polygons[i].feature) { - $("#feature").text(polygons[i].feature); - } else { - $("#feature").text("n/a"); - } - if (polygons[i].precipitation) { - var prec = Math.floor(polygons[i].precipitation * 500); - $("#precipitation").text(prec); - } else { - $("#precipitation").text("n/a"); - var prec = "ocean"; - } - if (polygons[i].biom) { - $("#biom").text(biomNames[polygons[i].biom]); - } else { - $("#biom").text("no"); - } - var height = (polygons[i].height).toFixed(2); - $("#height").text(height); - if (height >= 0.2) { - var temp = Math.floor(temperatureInput.value - (polygons[i].height - 0.2) * 20); - $("#temperature").text(temp); - } else { - var temp = temperatureInput.value; - $("#temperature").text(temperatureInput.value); - } - if (height >= 0.2) { - var elev = Math.ceil((height-0.195) * 4000 * height); - } else if (height < 0.2 && height > 0) { - var elev = Math.ceil((height-0.2) * 70 / height); - } else { - var elev = "-1000"; - } - $("#elevation").text(elev); - if (journeyStep > 0) { - if (height > 0) { - if (journeyStep === 1) { - var hint = "Height: " + height + " (" + elev + " m)"; - } else if (journeyStep === 2) { - if (prec !== "ocean") { - var hint = "Height: " + elev + "m " + "Temperature: " + temp + "°C " + "Precipitation: " + prec + "cm"; - } else { - var hint = "Height: " + elev + "m " + "Temperature: " + temp + "°C"; - } - } - } - $("#hintbar").text(hint); - } - if (polygons[i].river) { - $("#river").text(polygons[i].river); - } else { - $("#river").text("no"); - } - // cell_line highlighting - if (cell_line.getAttribute("start") != "") { - var next = +cell_line.getAttribute("start"); - highlighted.selectAll("*").remove(); - highlighting = []; - // from to i - while (next != i) { - var min = 1000; - polygons[next].neighbors.forEach(function(e) { - var x = polygons[i].data[0] - polygons[e].data[0]; - var y = polygons[i].data[1] - polygons[e].data[1]; - var diff = Math.hypot(x, y); - if (diff < min) { - min = diff; - next = e; - } - }); - highlighting.push(next); - } - highlighting.map(function(h) { - highlighted.append("path") - .attr("d", "M" + polygons[h].join("L") + "Z"); - }); - } - } - - function simulateWind(trend, winds) { - if ($("#main").length == 0) { - $("#canvasContainer").append(""); - $("#canvasContainer").append(""); - } - cancelAnimationFrame(animation); - boids = []; // remove all elements - var init = new Vec2(Math.cos(trend) * 0.25, Math.sin(trend) * 0.25); // initial change - var persistence = init.clone().scale(persistenceInput.value); // persistence of change (1% of initial change) - var waterPolygons = $.grep(polygons, function(e) {return (e.height < 0.2);}); - var canvas = document.getElementById("main"), - context = canvas.getContext("2d"), - offscreen = document.querySelector(".off"), - offscreenContext = offscreen.getContext("2d"), - elements = 800, - wave = 7, - maxVelocity = 2; - offscreenContext.globalAlpha = 0.95; - offscreenContext.clearRect(0, 0, mapWidth, mapHeight); - context.clearRect(0, 0, mapWidth, mapHeight); - animation = requestAnimationFrame(tick); - animated = true; - - $("#map_wind_animation").click(function() { - if (animated) { - cancelAnimationFrame(animation); - animated = false; - } else { - animation = requestAnimationFrame(tick); - animated = true; - } - }); - - function tick() { - offscreenContext.clearRect(0, 0, mapWidth, mapHeight); - offscreenContext.drawImage(canvas, 0, 0, mapWidth, mapHeight); - context.clearRect(0, 0, mapWidth, mapHeight); - context.drawImage(offscreen, 0, 0, mapWidth, mapHeight); - var angleMod = angleInput.value; - if (elements - boids.length >= wave) { - if (boids.length > 200) {addInternalBlow(Math.floor(wave*0.2));} - addExternalBlows(Math.floor(wave*0.8)); - } - boids.forEach(function(b, i){ - var x = Math.ceil(b.pos.x); - var y = Math.ceil(b.pos.y); - var hCur = pointsCellHeights[x + y * mapWidth]; - if (!hCur) {hCur = 0.2;} - var fPos = b.pos.clone().add(b.change); - var x = Math.ceil(fPos.x); - var y = Math.ceil(fPos.y); - var hNew = pointsHeights[x + y * mapWidth]; - if (!hNew) {boids.splice(i, 1); return;} - var alignment = new Vec2(); - var separation = new Vec2(); - boids.forEach(function(b2){ - if (b === b2) {return;} - var diff = b2.pos.clone().subtract(b.pos); - var distance = diff.length(); - if (distance) { - if (distance < 5 && hNew < 0.2) { - boids.splice(i, 1); // remove element; - return; - } - if (distance < 5) {separation.add(diff.clone().scaleTo(-1 / distance));} - if (distance < 20) {alignment.add(b2.change.clone().scale(1 / distance));} - } - }); - if (hCur >= 0.2 && hNew >= 0.2) { - var dif = (hCur - hNew) * 3; - var cliff = hNew - 0.25; - if (cliff < 0) {cliff = 0.01;} - var angle = dif * cliff * angleMod; - - var lc = b.change.clone().turn(angle).scaleTo(10); - var rc = b.change.clone().turn(angle * -1).scaleTo(10); - var lp = b.pos.clone().add(lc); - var rp = b.pos.clone().add(rc); - var lh = pointsHeights[Math.ceil(lp.x) + Math.ceil(lp.y) * mapWidth]; - var rh = pointsHeights[Math.ceil(rp.x) + Math.ceil(rp.y) * mapWidth]; - if (lh < rh) {b.change.turn(angle);} else {b.change.turn(angle * -1);} - b.change.scale(0.8 + dif); - } else { - b.change.scale(1.01).scaleTo(maxVelocity); - } - b.change.add(alignment.scaleTo(alignmentInput.value)); - b.change.add(separation.scale(separationInput.value)); - b.change.add(persistence).truncate(maxVelocity); - b.pos.add(b.change); - if (b.change.length() > 0.1) { - context.beginPath(); - context.fillStyle = $(".jscolor").css("background-color"); - context.arc(b.pos.x, b.pos.y, 1, 1, Math.PI); - context.fill(); - } else { - boids.splice(i, 1); // remove element; - return; - } - }); - $("#info").text(boids.length); - animation = requestAnimationFrame(tick); - } - - function addExternalBlows(count) { - for (var i = 0; i < count; i++) { - var x, y; - if (Math.random() > 0.5) { - if (winds === "North-East" || winds === "South-East") {x = mapWidth;} - if (winds === "North-West" || winds === "South-West") {x = 0;} - y = Math.floor(Math.random() * mapHeight); - } else { - if (winds === "South-West" || winds === "South-East") {y = mapHeight-1;} - if (winds === "North-West" || winds === "North-East") {y = 0;} - x = Math.floor(Math.random() * mapWidth); - } - if (winds === "North") {y = 0; x = Math.floor(Math.random() * mapWidth);} - if (winds === "South") {y = mapHeight-1; x = Math.floor(Math.random() * mapWidth);} - if (winds === "West") {x = 0; y = Math.floor(Math.random() * mapHeight);} - if (winds === "East") {x = mapWidth; y = Math.floor(Math.random() * mapHeight);} - boids.push({pos: new Vec2(x, y), change: init.clone()}); - } - } - - function addInternalBlow(count) { - for (var i = 0; i < count; i++) { - var p = Math.floor(Math.random() * waterPolygons.length); - var x = waterPolygons[p].data[0]; - var y = waterPolygons[p].data[1]; - boids.push({pos: new Vec2(x, y), change: init.clone()}); - } - } - } - - // Based on https://www.jasondavies.com/poisson-disc - function poissonDiscSampler(width, height, radius) { - var k = 5, // maximum number of samples before rejection - radius2 = radius * radius, - R = 3 * radius2, - cellSize = radius * Math.SQRT1_2, - gridWidth = Math.ceil(width / cellSize), - gridHeight = Math.ceil(height / cellSize), - grid = new Array(gridWidth * gridHeight), - queue = [], - queueSize = 0, - sampleSize = 0; - return function() { - if (!sampleSize) return sample(Math.random() * width, Math.random() * height); - // Pick a random existing sample and remove it from the queue - while (queueSize) { - var i = Math.random() * queueSize | 0, - s = queue[i]; - // Make a new candidate between [radius, 2 * radius] from the existing sample. - for (var j = 0; j < k; ++j) { - var a = 2 * Math.PI * Math.random(), - r = Math.sqrt(Math.random() * R + radius2), - x = s[0] + r * Math.cos(a), - y = s[1] + r * Math.sin(a); - // Reject candidates that are outside the allowed extent, or closer than 2 * radius to any existing sample - if (0 <= x && x < width && 0 <= y && y < height && far(x, y)) return sample(x, y); - } - queue[i] = queue[--queueSize]; - queue.length = queueSize; - } - }; - function far(x, y) { - var i = x / cellSize | 0, - j = y / cellSize | 0, - i0 = Math.max(i - 2, 0), - j0 = Math.max(j - 2, 0), - i1 = Math.min(i + 3, gridWidth), - j1 = Math.min(j + 3, gridHeight); - for (j = j0; j < j1; ++j) { - var o = j * gridWidth; - for (i = i0; i < i1; ++i) { - if (s = grid[o + i]) { - var s, - dx = s[0] - x, - dy = s[1] - y; - if (dx * dx + dy * dy < radius2) return false; - } - } - } - return true; - } - function sample(x, y) { - var s = [x, y]; - queue.push(s); - grid[gridWidth * (y / cellSize | 0) + (x / cellSize | 0)] = s; - ++sampleSize; - ++queueSize; - return s; - } - } - - // Hotkeys - d3.select("body").on("keydown", function() { - switch(d3.event.keyCode) { - case 27: // Escape for back - back(); - break; - case 13: // Enter for next - next(); - break; - case 32: // Space for next - next(); - break; - case 37: // Left - if (viewX + 10 <= 0) { - viewX += 10; - zoomUpdate(); - } - break; - case 39: // Right - if (viewX - 10 >= (mapWidth * (scale-1) * -1)) { - viewX -= 10; - zoomUpdate(); - } - break; - case 38: // Up - if (viewY + 10 <= 0) { - viewY += 10; - zoomUpdate(); - } - break; - case 40: // Down - if (viewY - 10 >= (mapHeight * (scale-1) * -1)) { - viewY -= 10; - zoomUpdate(); - } - break; - case 107: // Plus - if (scale < 40) { - var dx = mapWidth / 2 * (scale-1) + viewX; - var dy = mapHeight / 2 * (scale-1) + viewY; - viewX = dx - mapWidth / 2 * scale; - viewY = dy - mapHeight / 2 * scale; - scale += 1; - if (scale > 40) {scale = 40;} - zoomUpdate(); - } - break; - case 109: // Minus - if (scale > 1) { - var dx = mapWidth / 2 * (scale-1) + viewX; - var dy = mapHeight / 2 * (scale-1) + viewY; - viewX += mapWidth / 2 - dx; - viewY += mapHeight / 2 - dy; - scale -= 1; - if (scale < 1) { - scale = 1; - viewX = 0; - viewY = 0; - } - zoomUpdate(); - } - break; - } - }); - - // Downoad map in SVG - d3.select("#download").on("click", function() { - var config = {filename: 'map_dowloaded',} - d3_save_svg.save(d3.select('svg').node(), config); - svg.selectAll("*").attr("style", null); - }); -} \ No newline at end of file diff --git a/WIP version/vec2.js b/WIP version/vec2.js deleted file mode 100644 index 30f972b7..00000000 --- a/WIP version/vec2.js +++ /dev/null @@ -1,64 +0,0 @@ -function Vec2(x, y) { - this.x = x || 0; - this.y = y || 0; - return this; -} - -Vec2.prototype.add = function(v) { - this.x += v.x; - this.y += v.y; - return this; -}; - -Vec2.prototype.subtract = function(v) { - this.x -= v.x; - this.y -= v.y; - return this; -}; - -Vec2.prototype.scale = function(s) { - this.x = this.x * s; - this.y = this.y * s; - return this; -}; - -Vec2.prototype.scaleTo = function(s) { - var length = this.length(); - this.x = this.x * s / length; - this.y = this.y * s / length; - return this; -}; - -Vec2.prototype.normalize = function() { - var length = this.length(); - this.x = this.x / length; - this.y = this.y / length; - return this; -}; - -Vec2.prototype.length = function() { - return Math.sqrt(this.x * this.x + this.y * this.y); -}; - -Vec2.prototype.truncate = function(max) { - var length = this.length(); - if (length > max) { - this.x = this.x * max / length; - this.y = this.y * max / length; - } - return this; -}; - -Vec2.prototype.dot = function(v) { - return this.x * v.x + this.y * v.y; -}; - -Vec2.prototype.clone = function() { - return new Vec2(this.x, this.y); -}; - -Vec2.prototype.turn = function(a) { - this.x = this.x * Math.cos(a) - this.y * Math.sin(a), - this.y = this.x * Math.sin(a) + this.y * Math.cos(a) - return this; -}; \ No newline at end of file diff --git a/Demo version/fonts.css b/fonts.css similarity index 100% rename from Demo version/fonts.css rename to fonts.css diff --git a/icons.css b/icons.css new file mode 100644 index 00000000..8e8ba0fc --- /dev/null +++ b/icons.css @@ -0,0 +1,210 @@ +@font-face { + font-family: 'icons'; + src: url('data:application/font-woff2;base64,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') format('woff2'); + font-weight: normal; + font-style: normal; +} + + [class^="icon-"]:before, [class*=" icon-"]:before, [class^="icon-"]:after, [class*=" icon-"]:after { + font-family: "icons"; + font-style: normal; + font-weight: normal; + speak: none; + + display: inline-block; + text-decoration: inherit; + width: 1em; + text-align: center; + font-size: 1em; + margin: -1px; + padding: 0; + + /* For safety - reset parent styles, that can break glyph codes*/ + font-variant: normal; + text-transform: none; + line-height: 1em; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ +} + +/* Font Awesome icons */ +.icon-pencil:before { content: '\e800'; } /* '' */ +.icon-font:before { content: '\e801'; } /* '' */ +.icon-arrows-cw:before { content: '\e802'; } /* '' */ +.icon-doc:before { content: '\e803'; } /* '' */ +.icon-trash-empty:before { content: '\e804'; } /* '' */ +.icon-ok:before { content: '\e805'; } /* '' */ +.icon-ok-circled:before { content: '\e806'; } /* '' */ +.icon-ok-circled2:before { content: '\e807'; } /* '' */ +.icon-link:before { content: '\e808'; } /* '' */ +.icon-globe:before { content: '\e809'; } /* '' */ +.icon-plus:before { content: '\e80a'; } /* '' */ +.icon-plus-circled:before { content: '\e80b'; } /* '' */ +.icon-minus-circled:before { content: '\e80c'; } /* '' */ +.icon-minus:before { content: '\e80d'; } /* '' */ +.icon-text-height:before { content: '\e80e'; } /* '' */ +.icon-adjust:before { content: '\e80f'; } /* '' */ +.icon-tag:before { content: '\e810'; } /* '' */ +.icon-tags:before { content: '\e811'; } /* '' */ +.icon-logout:before { content: '\e812'; } /* '' */ +.icon-download:before { content: '\e813'; } /* '' */ +.icon-down-circled2:before { content: '\e814'; } /* '' */ +.icon-upload:before { content: '\e815'; } /* '' */ +.icon-up-circled2:before { content: '\e816'; } /* '' */ +.icon-cancel-circled2:before { content: '\e817'; } /* '' */ +.icon-cancel-circled:before { content: '\e818'; } /* '' */ +.icon-cancel:before { content: '\e819'; } /* '' */ +.icon-check:before { content: '\e81a'; } /* '' */ +.icon-align-left:before { content: '\e81b'; } /* '' */ +.icon-align-center:before { content: '\e81c'; } /* '' */ +.icon-align-right:before { content: '\e81d'; } /* '' */ +.icon-align-justify:before { content: '\e81e'; } /* '' */ +.icon-star:before { content: '\e81f'; } /* '' */ +.icon-star-empty:before { content: '\e820'; } /* '' */ +.icon-search:before { content: '\e821'; } /* '' */ +.icon-mail:before { content: '\e822'; } /* '' */ +.icon-eye:before { content: '\e823'; } /* '' */ +.icon-eye-off:before { content: '\e824'; } /* '' */ +.icon-pin:before { content: '\e825'; } /* '' */ +.icon-lock-open:before { content: '\e826'; } /* '' */ +.icon-lock:before { content: '\e827'; } /* '' */ +.icon-attach:before { content: '\e828'; } /* '' */ +.icon-home:before { content: '\e829'; } /* '' */ +.icon-info-circled:before { content: '\e82a'; } /* '' */ +.icon-help-circled:before { content: '\e82b'; } /* '' */ +.icon-shuffle:before { content: '\e82c'; } /* '' */ +.icon-ccw:before { content: '\e82d'; } /* '' */ +.icon-cw:before { content: '\e82e'; } /* '' */ +.icon-play:before { content: '\e82f'; } /* '' */ +.icon-play-circled2:before { content: '\e830'; } /* '' */ +.icon-down-big:before { content: '\e831'; } /* '' */ +.icon-left-big:before { content: '\e832'; } /* '' */ +.icon-right-big:before { content: '\e833'; } /* '' */ +.icon-up-big:before { content: '\e834'; } /* '' */ +.icon-up-open:before { content: '\e835'; } /* '' */ +.icon-right-open:before { content: '\e836'; } /* '' */ +.icon-left-open:before { content: '\e837'; } /* '' */ +.icon-down-open:before { content: '\e838'; } /* '' */ +.icon-cloud:before { content: '\e839'; } /* '' */ +.icon-text-width:before { content: '\e83a'; } /* '' */ +.icon-italic:before { content: '\e83b'; } /* '' */ +.icon-bold:before { content: '\e83c'; } /* '' */ +.icon-retweet:before { content: '\e83d'; } /* '' */ +.icon-user:before { content: '\e83e'; } /* '' */ +.icon-users:before { content: '\e83f'; } /* '' */ +.icon-flag:before { content: '\e840'; } /* '' */ +.icon-heart:before { content: '\e841'; } /* '' */ +.icon-heart-empty:before { content: '\e842'; } /* '' */ +.icon-edit:before { content: '\e843'; } /* '' */ +.icon-export:before { content: '\e844'; } /* '' */ +.icon-cog:before { content: '\e845'; } /* '' */ +.icon-cog-alt:before { content: '\e846'; } /* '' */ +.icon-wrench:before { content: '\e847'; } /* '' */ +.icon-resize-vertical:before { content: '\e848'; } /* '' */ +.icon-resize-small:before { content: '\e849'; } /* '' */ +.icon-resize-full:before { content: '\e84a'; } /* '' */ +.icon-resize-horizontal:before { content: '\e84b'; } /* '' */ +.icon-target:before { content: '\e84c'; } /* '' */ +.icon-signal:before { content: '\e84d'; } /* '' */ +.icon-umbrella:before { content: '\e84e'; } /* '' */ +.icon-leaf:before { content: '\e84f'; } /* '' */ +.icon-book:before { content: '\e850'; } /* '' */ +.icon-asterisk:before { content: '\e851'; } /* '' */ +.icon-chart-bar:before { content: '\e852'; } /* '' */ +.icon-key:before { content: '\e853'; } /* '' */ +.icon-hammer:before { content: '\e854'; } /* '' */ +.icon-town-hall:before { content: '\e855'; } /* '' */ +.icon-move:before { content: '\f047'; } /* '' */ +.icon-link-ext:before { content: '\f08e'; } /* '' */ +.icon-check-empty:before { content: '\f096'; } /* '' */ +.icon-resize-full-alt:before { content: '\f0b2'; } /* '' */ +.icon-docs:before { content: '\f0c5'; } /* '' */ +.icon-list-bullet:before { content: '\f0ca'; } /* '' */ +.icon-mail-alt:before { content: '\f0e0'; } /* '' */ +.icon-sitemap:before { content: '\f0e8'; } /* '' */ +.icon-exchange:before { content: '\f0ec'; } /* '' */ +.icon-download-cloud:before { content: '\f0ed'; } /* '' */ +.icon-upload-cloud:before { content: '\f0ee'; } /* '' */ +.icon-plus-squared:before { content: '\f0fe'; } /* '' */ +.icon-circle-empty:before { content: '\f10c'; } /* '' */ +.icon-folder-empty:before { content: '\f114'; } /* '' */ +.icon-folder-open-empty:before { content: '\f115'; } /* '' */ +.icon-flag-empty:before { content: '\f11d'; } /* '' */ +.icon-star-half-alt:before { content: '\f123'; } /* '' */ +.icon-fork:before { content: '\f126'; } /* '' */ +.icon-unlink:before { content: '\f127'; } /* '' */ +.icon-help:before { content: '\f128'; } /* '' */ +.icon-info:before { content: '\f129'; } /* '' */ +.icon-eraser:before { content: '\f12d'; } /* '' */ +.icon-rocket:before { content: '\f135'; } /* '' */ +.icon-anchor:before { content: '\f13d'; } /* '' */ +.icon-lock-open-alt:before { content: '\f13e'; } /* '' */ +.icon-play-circled:before { content: '\f144'; } /* '' */ +.icon-minus-squared:before { content: '\f146'; } /* '' */ +.icon-minus-squared-alt:before { content: '\f147'; } /* '' */ +.icon-level-up:before { content: '\f148'; } /* '' */ +.icon-level-down:before { content: '\f149'; } /* '' */ +.icon-ok-squared:before { content: '\f14a'; } /* '' */ +.icon-pencil-squared:before { content: '\f14b'; } /* '' */ +.icon-expand:before { content: '\f150'; } /* '' */ +.icon-collapse:before { content: '\f151'; } /* '' */ +.icon-expand-right:before { content: '\f152'; } /* '' */ +.icon-sort-alt-up:before { content: '\f160'; } /* '' */ +.icon-sort-alt-down:before { content: '\f161'; } /* '' */ +.icon-female:before { content: '\f182'; } /* '' */ +.icon-male:before { content: '\f183'; } /* '' */ +.icon-sun:before { content: '\f185'; } /* '' */ +.icon-box:before { content: '\f187'; } /* '' */ +.icon-bug:before { content: '\f188'; } /* '' */ +.icon-right-circled2:before { content: '\f18e'; } /* '' */ +.icon-left-circled2:before { content: '\f190'; } /* '' */ +.icon-collapse-left:before { content: '\f191'; } /* '' */ +.icon-dot-circled:before { content: '\f192'; } /* '' */ +.icon-plus-squared-alt:before { content: '\f196'; } /* '' */ +.icon-bank:before { content: '\f19c'; } /* '' */ +.icon-child:before { content: '\f1ae'; } /* '' */ +.icon-tree:before { content: '\f1bb'; } /* '' */ +.icon-history:before { content: '\f1da'; } /* '' */ +.icon-header:before { content: '\f1dc'; } /* '' */ +.icon-sliders:before { content: '\f1de'; } /* '' */ +.icon-trash:before { content: '\f1f8'; } /* '' */ +.icon-brush:before { content: '\f1fc'; } /* '' */ +.icon-chart-area:before { content: '\f1fe'; } /* '' */ +.icon-chart-pie:before { content: '\f200'; } /* '' */ +.icon-chart-line:before { content: '\f201'; } /* '' */ +.icon-user-secret:before { content: '\f21b'; } /* '' */ +.icon-venus:before { content: '\f221'; } /* '' */ +.icon-mars:before { content: '\f222'; } /* '' */ +.icon-venus-mars:before { content: '\f228'; } /* '' */ +.icon-neuter:before { content: '\f22c'; } /* '' */ +.icon-user-plus:before { content: '\f234'; } /* '' */ +.icon-user-times:before { content: '\f235'; } /* '' */ +.icon-object-ungroup:before { content: '\f248'; } /* '' */ +.icon-clone:before { content: '\f24d'; } /* '' */ +.icon-hourglass-1:before { content: '\f251'; } /* '' */ +.icon-hand-grab-o:before { content: '\f255'; } /* '' */ +.icon-hand-paper-o:before { content: '\f256'; } /* '' */ +.icon-calendar-check-o:before { content: '\f274'; } /* '' */ +.icon-map-pin:before { content: '\f276'; } /* '' */ +.icon-map-signs:before { content: '\f277'; } /* '' */ +.icon-map-o:before { content: '\f278'; } /* '' */ +.icon-map:before { content: '\f279'; } /* '' */ +.icon-fort-awesome:before { content: '\f286'; } /* '' */ +.icon-percent:before { content: '\f295'; } /* '' */ + +/* Amended FA icons */ +.icon-sort-name-up:after { font-size: 9px; content: '\f15d'; } +.icon-sort-name-down:after { font-size: 9px; content: '\f15e'; } +.icon-sort-number-up:after { font-size: 9px; content: '\f162'; } +.icon-sort-number-down:after { font-size: 9px; content: '\f163'; } + +/* Custom icons */ +.icon-w:before { font-style: italic; content: 'w:'; } +.icon-n:before { font-style: italic; content: 'n:'; } +.icon-i:before { font-style: italic; content: 'i:'; } +.icon-s:before { font-style: italic; content: 's:'; } +.icon-a:before { font-style: italic; content: 'a:'; } +.icon-smooth:before {font-weight: bold; content: '∼'; } +.icon-disrupt:before {font-weight: bold; content: '෴'; } +.icon-if:before {font-style: italic; font-weight: bold; content: 'if'; } \ No newline at end of file diff --git a/images/Facebook.png b/images/Facebook.png new file mode 100644 index 0000000000000000000000000000000000000000..3d249fd9f3c4df98b2666c3716c8cfb0c2911693 GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANNfte!58Ar-gYUf-K_C_thi zvD2ha&(qtvm|6A+Uu=&0^mXSh&38u&5Eu6sgZ_kV#*5xW&d~K!Wj&4Wr(+0M(lhjr<#$ zMXzvPyOB^|aCWU#LXUODj)RlWHHgdfE!Td)zU{^ju2`ND)|$?!R3;MibuXg9|W|43u!*HfHVR<~^9*x?a*x#g$60pow;2jZO@ XCfgp^WU-Bbfq}u()z4*}Q$iB}NRNUY literal 0 HcmV?d00001 diff --git a/images/Pinterest.png b/images/Pinterest.png new file mode 100644 index 0000000000000000000000000000000000000000..fcc85914e44e6ce32a9ddbf1cfdfe0e085ef437e GIT binary patch literal 443 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANNfO`a}}Ar-gYUbok1DU>+y z@pSBqIg5)u#a{m`Pc?`TJ=}S5nMIhN)lwa<)%KBpv{M6kQY;s~+jKjE$17GWR*`2# zbxr&I4@=g0|GgJ?`1h6cUwgmSc0va9&@4d!!MZezJ-phA+SB1me z-Uf>!62{%H4BJIkEl}q*JeJF%<6OXQ&t%ao;rZfaK)SmblaWBqOx9R|RK}{P54;Db z_BP0{bf-BoE#h(VpKWEmU2p^c!Ny1dcflrc6NmE+TsO7}8t@!sf5b8CXjAZ?d8MKT zS;`B9#9!%Vv`cKhAnfY6ca!h7eau^DxErg59#|M9cVwegbkQq4i$)E}H4oX6QUpts z7D!cY{UNldCXqdHd7ks%P?<(~XAkAhu;uF?bBYQ$&)g`#f$5+wQy$A3Cj-{`(u~z7 v79U&NAR?4-hjYb&_+!80AF%%U-yrW(5ae;4eO(s=0|SGntDnm{r-UW|AG@yg literal 0 HcmV?d00001 diff --git a/images/Reddit.png b/images/Reddit.png new file mode 100644 index 0000000000000000000000000000000000000000..4637f3a4e21bf94eaec3c02da7d92bfd5ec64ed0 GIT binary patch literal 509 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANNfM?75|Ln>~)y>`C4r%;By zz}vd)dRpp=)Xr@ps#A(CY}1i^{b19#XG{Lvki4lIv?L{Sx`c|-?EAN_`B_`vn7w=V zr0z+JyHEdPeOx-@@bZ%fZOR@Qyswg-ci!jz^VrXG-+$K8ntu9!$YO`Z4vP=uw{vc4 z41Kt(Rp+>8Xj-ZEg>&v{l_y#68Jv>+WO8-$0fq9+L}^RA*7NokV$L(2f1&)0t-s>j z)2e?gnO!02oXj$AV(T2b>^1bueO8HE2@7MYt(`C}<8TS;=Ulzr+W}%Dr`y1kU8+xvWEN`Cr(8{?} zM0Hn|=7u?vTr%9<>mGC4pKSS=w(oOuY+~Ic&$JgSO8I#{O+A`;ka>!BUhB_`2KL@} z-0w^HY~r+@sj{q>ea}+sGvObaGOapiD$QNuAYEKC!6ftEt2c@4 zhRJi>Cy8dHwmmes?J_aE$M9TsR}SZW>*FTg|G%l^q&In19o{qhuc-9lJ^h+;m$prC zFKk;ba-z74vCrU0E|-nt$_cD>5~YP5I^x=!zHFX0W5zM-L{Omqk9;8Rd0^4yDDBVM Q3=9kmp00i_>zopr0B~dMNB{r; literal 0 HcmV?d00001 diff --git a/images/Tumblr.png b/images/Tumblr.png new file mode 100644 index 0000000000000000000000000000000000000000..2b65ddad9b169e1ca4e055907145f05f0c57ee81 GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}e?46sLn>~)y>95m>?qQZ zxY#AdTt#!sR2hX0F1I6&b62!oiHeMP#p=X2$!=3*#08@XK^u%%JPmF{+x%BL`r$?r zv+?GR&kwTObn7JK4$F0TEOm0=(D)j7Q07s|^43L#QWG9ydq{S51+i<4* zfbJ24&!QI&FuR--)IPqA*{Y&h^Bcje%p|8zQO%Aqv0=!2hvG17O$VP z`&N_HH7$j&JKKD7LL9`H{?#7ne$TL%RolhjIm^V=rZw#v=XV@5eYf$z($&`sSTr9V z3U!daEW{XloAH-co5#i@V)JJt_h`%P>$%t zc)Mi90*f0~J6ia}N(5K}3pYJb)BDTB$9l1;ua1509T{1cbir4*a$Y@&a6GQSC&uci z)%vHltwA8^+-~j{1^R!c`S3ry^tz+tkEZworWl7;&WEQOGRtRP=F>=!+8@dNUE&dQ ztj^*l*)y|Qd>#r)pNNv4l+=)3^5F1g-iU?=!nZwctHdeVcNFxBb?ss_b(wHOHB5+c zwLq(Kg@ILztcOzrv&jb5lNa1?eh~<}=(3{X=p@A>D>4u0-22F8Sd#o%QcTc6M@E|c z$m+%Ef*aCA1@dKMJC<2b`NWao%#+h}lYL47)5U_Ua`7ekoX-VX8Ipg-xZVG}v7Ozc zjoar*p|seA1Cmt%e;?Q++6(6XWwX(FB(S~WpnxD7M`3Gh$if+aC08uyv%F%!H+Sd% h7QF+kf6h1PzcZF7J(wE*n}LCW!PC{xWt~$(695MmmWluX literal 0 HcmV?d00001 diff --git a/images/favicon-16x16.png b/images/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..ddd75b4a47049ee93c320e33e4513b1e7ad3ddfb GIT binary patch literal 740 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 literal 0 HcmV?d00001 diff --git a/images/preview.png b/images/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..aaa8459c19b8157dd59f69dc333cc612c6e48556 GIT binary patch literal 90267 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

ltkU8-Kkhc&ik!bdlFz`# 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 literal 0 HcmV?d00001 diff --git a/index.css b/index.css new file mode 100644 index 0000000000000000000000000000000000000000..df03bf56284b1f49af3aa6d0d4afc21070f50cd3 GIT binary patch literal 102040 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 literal 0 HcmV?d00001 diff --git a/Demo version/index.html b/index.html similarity index 53% rename from Demo version/index.html rename to index.html index 4285f51c..24516794 100644 --- a/Demo version/index.html +++ b/index.html @@ -1,23 +1,36 @@ Azgaar's Fantasy Map Generator Demo - - - - - - - - + + + + + + + + + + + + + + - + + + + + + - - - - + +

+ @@ -34,7 +47,7 @@
- + Anchor @@ -50,10 +63,49 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - +
@@ -66,6 +118,7 @@ +

Select preset:

@@ -81,13 +134,14 @@
  • Ocean
  • Landmass
  • Heightmap
  • +
  • Grid
  • +
  • Overlay
  • Cultures
  • Routes
  • Rivers
  • Countries
  • Borders
  • Relief
  • -
  • Grid
  • Labels
  • Burgs
  • @@ -97,6 +151,8 @@
    +
    +
    Overlay type:
    +
    Size: + 5 +
    Fill: #5E4FA2 @@ -144,7 +210,7 @@

    Radius: Stroke: -
    +

    Opacity: 1 @@ -164,16 +230,30 @@
    -
    -

    Toggle filters:

    - - - - +
    +
    +

    Toggle filters:

    + + + + +

    Generate new map to apply the options!

    + + + + + - + + + + + + - + + + + + + @@ -283,57 +381,66 @@
    Map size + w: + + h: + + + +
    Heightmap template @@ -190,14 +270,23 @@
    Graph sizeGraph size - + 1
    Randomize + + + +
    Burgs count @@ -226,12 +315,21 @@
    Burg influence radiusNeutral distance - + - 100 + 200 +
    Precipitation + + + 15
    -

    Heightmap customization:

    -
    - - - +
    +

    Customize:

    + + +
    -
    @@ -367,24 +474,29 @@
    +
    - -