Merge pull request #1 from Azgaar/master

update
This commit is contained in:
Youri Schuurmans 2018-09-02 12:35:36 +02:00 committed by GitHub
commit 51f46d5183
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 4836 additions and 2379 deletions

View file

@ -1,14 +1,12 @@
# Fantasy Map Generator # Fantasy Map Generator
Azgaar's _Fantasy Map Generator_. Based on [D3](https://d3js.org) Voronoi diagram rendered in svg. Azgaar's _Fantasy Map Generator_. Online tool generating interactive svg maps based on [D3](https://d3js.org) voronoi diagram.
Project goal is a procedurally generated map for my *Medieval Dynasty* simulator. Map should be interactive, scalable, fast and plausible. Initial intend was to place at least 500 burgs within 7 cultural areas and imagined land area about 1 million km<sup>2</sup>. As of now all these parameters are customizable. Project is under active development, check out the work in progress version [here](https://azgaar.github.io/Fantasy-Map-Generator). Refer to the [project wiki](https://github.com/Azgaar/Fantasy-Map-Generator/wiki) for a guidance. 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 [Trello devboard](https://trello.com/b/7x832DG4/fantasy-map-generator).
[![alt tag](https://i0.wp.com/azgaar.files.wordpress.com/2017/03/80k-part.png)](https://azgaar.wordpress.com) [![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). Refer to [the project wiki](https://github.com/Azgaar/Fantasy-Map-Generator/wiki) for a quick guidance. The the previous versions see the [changelog](https://github.com/Azgaar/Fantasy-Map-Generator/wiki/Changelog). If you find the Demo performance low, open the page in a smaller window and use the graph size = 1. Join our [Reddit community](https://www.reddit.com/r/FantasyMapGenerator) to share the created maps, discuss the Generator, suggest ideas and get a most recent updates. You may also contact me directly via [email](mailto:maxganiev@yandex.com). For bug reports please use the project [issues page](https://github.com/Azgaar/Fantasy-Map-Generator/issues). If you face performance issues, please try to open the page in a small window and use the default graph size only. In Firefox fast map zooming may cause browser crush.
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).
_Inspiration:_ _Inspiration:_

View file

@ -10,7 +10,6 @@
font-style: normal; font-style: normal;
font-weight: normal; font-weight: normal;
speak: none; speak: none;
display: inline-block; display: inline-block;
text-decoration: inherit; text-decoration: inherit;
width: 1em; width: 1em;

156
index.css
View file

@ -47,8 +47,7 @@ button, select, a {
} }
#cults { #cults {
stroke-width: 0.7; stroke-width: 2;
stroke-linejoin: round;
mask: url(#shape); mask: url(#shape);
mask-mode: alpha; mask-mode: alpha;
pointer-events: none; pointer-events: none;
@ -60,8 +59,8 @@ button, select, a {
} }
#landmass { #landmass {
fill-rule: evenodd; mask: url(#shape);
stroke: none; mask-clip: no-clip;
} }
#lakes, #lakes,
@ -259,17 +258,21 @@ input[type="number"].editNumber {
} }
.line { .line {
stroke: #666666; stroke: #373737;
stroke-width: 1px; stroke-width: 1px;
stroke-dasharray: 6;
stroke-linecap: butt;
} }
.circle { .circle {
stroke-width: 1px; stroke-width: 1px;
fill: none; fill: none;
stroke-dasharray: 6;
stroke-linecap: butt;
} }
circle.drag { circle.drag {
stroke: white; stroke: #9f3237;
} }
text.drag { text.drag {
@ -290,7 +293,6 @@ text.drag {
font-size: smaller; font-size: smaller;
font-family: monospace; font-family: monospace;
position: absolute; position: absolute;
background-color: rgba(168, 130, 147, 0.85);
border: solid 1px #5e4fa2; border: solid 1px #5e4fa2;
} }
@ -449,7 +451,7 @@ button.active {
} }
.tabcontent button { .tabcontent button {
background-color: #997c89; background-color: #916e7f;
font-family: monospace; font-family: monospace;
border: none; border: none;
padding: 5px 8px; padding: 5px 8px;
@ -468,9 +470,13 @@ button.active {
margin: 0; margin: 0;
} }
fieldset {
border: 1px solid #5d4651;
}
.tabcontent li { .tabcontent li {
list-style-type: none; list-style-type: none;
background-color: #997c89; background-color: #916e7f;
cursor: pointer; cursor: pointer;
padding: 5px 8px; padding: 5px 8px;
margin: 4px; margin: 4px;
@ -512,6 +518,10 @@ p {
width: 35%; width: 35%;
} }
#customizeOptions {
margin: 2px 0;
}
#tooltip { #tooltip {
position: fixed; position: fixed;
display: none; display: none;
@ -519,7 +529,7 @@ p {
top: calc(98vh - (10px + 0.5vw)); top: calc(98vh - (10px + 0.5vw));
width: 100%; width: 100%;
cursor: default; cursor: default;
text-shadow: 1px 0px 1px #1d0e0f; text-shadow: 1px 1px 2px #1d0e0f;
color: #ffffff; color: #ffffff;
font-size: calc(10px + 0.5vw); font-size: calc(10px + 0.5vw);
pointer-events: none; pointer-events: none;
@ -530,8 +540,6 @@ p {
} }
#optionsContent table td:nth-of-type(2) { #optionsContent table td:nth-of-type(2) {
text-decoration: underline dotted gray;
cursor: help;
width: 126px; width: 126px;
} }
@ -594,8 +602,9 @@ body button.noicon {
background-image: linear-gradient(to right, #ffffff 0%, #fafafa 51%, #ebebeb 100%); background-image: linear-gradient(to right, #ffffff 0%, #fafafa 51%, #ebebeb 100%);
margin: 1px 1px; margin: 1px 1px;
width: 226px; width: 226px;
padding: 1px 2px; padding: 0px 2px;
font-size: 9px; height: 12px;
font-size: 10px;
} }
#templateBody>div:hover { #templateBody>div:hover {
@ -624,10 +633,9 @@ body button.noicon {
} }
#templateBody input { #templateBody input {
height: 4px; width: 40px;
width: 45px; height: 10px;
font-family: monospace; border: none;
height: 4px;
font-family: monospace; font-family: monospace;
} }
@ -661,18 +669,18 @@ body button.noicon {
border-right-color: #5e4fa2; border-right-color: #5e4fa2;
} }
#styleInputs div { #styleInputs > div {
display: none; display: none;
line-height: 6px; line-height: 8px;
} }
#styleInputs #styleOcean,
#styleInputs #styleOpacity, #styleInputs #styleOpacity,
#styleInputs #styleFill,
#styleInputs #styleFilter { #styleInputs #styleFilter {
display: block; display: block;
} }
#styleInputs button { #styleInputs .whiteButton {
padding: 0 6px; padding: 0 6px;
margin: 0 2px; margin: 0 2px;
border: 1px #827c7f solid; border: 1px #827c7f solid;
@ -684,11 +692,21 @@ body button.noicon {
font-size: xx-small; font-size: xx-small;
} }
#styleLabelGroups {
margin-top: 6px;
display: block;
}
#styleLabelGroups button {
display: inline-block;
margin: 5px 3px 0 3px;
padding: 2px 6px;
}
.pureInput { .pureInput {
display: inline-block; display: inline-block;
width: 50px; width: 50px;
height: 10px; height: 10px;
font-size: small;
font-size: smaller; font-size: smaller;
font-family: monospace; font-family: monospace;
} }
@ -741,15 +759,6 @@ body button.noicon {
stroke: #da3126; stroke: #da3126;
} }
body .ui-dialog {
padding: 1px;
font-size: 12px;
}
body .ui-dialog-titlebar {
font-size: 14px;
}
.ui-dialog input { .ui-dialog input {
height: 14px; height: 14px;
} }
@ -763,7 +772,7 @@ body .ui-dialog-titlebar {
.ui-dialog input[type="range"] { .ui-dialog input[type="range"] {
outline: none; outline: none;
height: 2px; height: 2px;
background: #e9e9e9; background: #d4d4d4;
top: -4px; top: -4px;
position: relative; position: relative;
appearance: none; appearance: none;
@ -790,6 +799,12 @@ body .ui-dialog-titlebar {
cursor: pointer; cursor: pointer;
} }
.ui-dialog input[type="number"] {
width: 28px;
height: 12px;
cursor: pointer;
}
.ui-dialog .disabled { .ui-dialog .disabled {
opacity: 0.2; opacity: 0.2;
} }
@ -883,7 +898,7 @@ div.slider .ui-slider-handle {
div.states { div.states {
border: 1px solid #d4d4d4; border: 1px solid #d4d4d4;
background-image: linear-gradient(to right, #fcfcfc 0%, #f2f2f2 51%, #dedede 100%); background-image: linear-gradient(to right, #fafafa80 0%, #f0f0f080 50%, #c8c8c880 100%);
margin: 1px 0; margin: 1px 0;
padding: 0 2px; padding: 0 2px;
font-size: 10px; font-size: 10px;
@ -891,7 +906,7 @@ div.states {
div.states:hover { div.states:hover {
border: 1px solid #c4c4c4; border: 1px solid #c4c4c4;
background-image: linear-gradient(to right, #dedede 100%, #f2f2f2 51%, #fcfcfc 0%); background-image: linear-gradient(to right, #dedede 100%, #f2f2f2 50%, #fcfcfc 0%);
} }
div.states * { div.states * {
@ -950,6 +965,13 @@ div.states>[class^="icon-"] {
padding: 0 1px 0 7px; padding: 0 1px 0 7px;
} }
div.states>[class="icon-arrows-cw"] {
color: #67575c;
padding: 0 2px 0 0;
font-size: 9px;
cursor: pointer;
}
div.states>.before { div.states>.before {
color: #6e5e66; color: #6e5e66;
padding: 0 1px 0 0; padding: 0 1px 0 0;
@ -959,6 +981,24 @@ div.states>.small {
font-size: 9px; font-size: 9px;
} }
div.states>.cultureName {
width: 50px;
}
div.states>.culturePopulation {
width: 40px;
}
div.states>.cultureBase {
width: 46px;
cursor: pointer;
border: 0;
background-color: transparent;
-webkit-appearance: textfield;
-moz-appearance: textfield;
appearance: textfield;
}
#burgsBody, #burgsBody,
#countriesBody { #countriesBody {
overflow: auto; overflow: auto;
@ -1270,6 +1310,48 @@ input[type="checkbox"] {
height: 100%; height: 100%;
} }
#capital-anchors, #town-anchors { #cultureCenters circle:hover {
transform: translate(-0.47em, -0.47em); stroke: #000000b3;
cursor: pointer;
}
#namesbaseEditor select,
#namesbaseEditor textarea {
font-size: 10px;
font-family: Copperplate, monospace;
outline: none;
}
#namesbaseEditor input {
font-size: 10px;
font-family: Copperplate, monospace;
outline: none;
height: 12px;
}
#namesbaseEditor fieldset {
margin: 3px 3px 5px 0;
border-style: dashed;
}
#namesbaseEditor span, #namesbaseEditor legend {
font-size: 9px;
font-weight: bold;
}
#namesbaseExamples {
font-family: Copperplate, monospace;
cursor: pointer;
}
#namesbaseName {
width: 80px;
}
#namesbaseMin, #namesbaseMax {
width: 33px;
}
#namesbaseDouble {
width: 40px;
} }

View file

@ -3,6 +3,7 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="libs/seedrandom.min.js"></script>
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-116735150-1"></script> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-116735150-1"></script>
<script> <script>
window.dataLayer = window.dataLayer || []; window.dataLayer = window.dataLayer || [];
@ -10,14 +11,14 @@
gtag('js', new Date()); gtag('js', new Date());
gtag('config', 'UA-116735150-1'); gtag('config', 'UA-116735150-1');
</script> </script>
<title>Azgaar's Fantasy Map Generator Demo</title> <title>Azgaar's Fantasy Map Generator</title>
<meta name="application-name" content="Azgaar's Fantasy Map Generator"> <meta name="application-name" content="Azgaar's Fantasy Map Generator">
<meta name="author" content="Azgaar (Max Ganiev)"> <meta name="author" content="Azgaar (Max Ganiev)">
<meta name="description" content="Azgaar's Fantasy Map Generator (demo). Based on D3 Voronoi diagram rendered to svg"> <meta name="description" content="Azgaar's Fantasy Map Generator and Editor">
<meta name="google" content="notranslate"> <meta name="google" content="notranslate">
<meta property="og:url" content="https://azgaar.github.io/Fantasy-Map-Generator/"> <meta property="og:url" content="https://azgaar.github.io/Fantasy-Map-Generator/">
<meta property="og:title" content="Azgaar's Fantasy Map Generator"> <meta property="og:title" content="Azgaar's Fantasy Map Generator">
<meta property="og:description" content="Demo version. Based on D3 Voronoi diagram rendered to svg"> <meta property="og:description" content="Based on Voronoi diagram rendered to svg">
<meta property="og:image" content="images/preview.png"> <meta property="og:image" content="images/preview.png">
<link rel="icon" type="image/png" href="images/favicon-32x32.png" sizes="32x32"/> <link rel="icon" type="image/png" href="images/favicon-32x32.png" sizes="32x32"/>
<link rel="icon" type="image/png" href="images/favicon-16x16.png" sizes="16x16"/> <link rel="icon" type="image/png" href="images/favicon-16x16.png" sizes="16x16"/>
@ -26,19 +27,19 @@
<script src="libs/d3.v4.min.js"></script> <script src="libs/d3.v4.min.js"></script>
<script src="libs/d3-scale-chromatic.v1.min.js"></script> <script src="libs/d3-scale-chromatic.v1.min.js"></script>
<script src="libs/priority-queue.min.js"></script> <script src="libs/priority-queue.min.js"></script>
<script src="names.js"></script>
<script src="libs/jquery-ui.min.js"></script> <script src="libs/jquery-ui.min.js"></script>
<script src="libs/polylabel.min.js"></script> <script src="libs/polylabel.min.js"></script>
<script src="libs/quantize.min.js" defer></script> <script src="libs/quantize.min.js" defer></script>
<script src="libs/d3-hexbin.v0.2.min.js" defer></script> <script src="libs/d3-hexbin.v0.2.min.js" defer></script>
<script src="libs/jquery.ui.touch-punch.min.js" defer></script> <script src="libs/jquery.ui.touch-punch.min.js" defer></script>
<link rel="stylesheet" type="text/css" href="index.css?version=0.57.03b"/> <link rel="stylesheet" type="text/css" href="index.css?version=0.59.07b"/>
<link rel="stylesheet" type="text/css" href="icons.css?version=0.57.03b"/> <link rel="stylesheet" type="text/css" href="icons.css?version=0.59.07b"/>
<link rel="stylesheet" type="text/css" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"/> <link rel="stylesheet" type="text/css" href="libs/jquery-ui.css"/>
</head> </head>
<body> <body>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="100%" height="100%"> <svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="100%" height="100%">
<defs> <defs>
<g id="filters">
<filter id="blurFilter" x="-1" y="-1" width="100" height="100"> <filter id="blurFilter" x="-1" y="-1" width="100" height="100">
<feGaussianBlur in="SourceGraphic" stdDeviation="0.2"/> <feGaussianBlur in="SourceGraphic" stdDeviation="0.2"/>
</filter> </filter>
@ -51,6 +52,17 @@
<filter id="blur10" x="-1" y="-1" width="100" height="100"> <filter id="blur10" x="-1" y="-1" width="100" height="100">
<feGaussianBlur in="SourceGraphic" stdDeviation="10"/> <feGaussianBlur in="SourceGraphic" stdDeviation="10"/>
</filter> </filter>
<filter id="splotch">
<feTurbulence type="fractalNoise" baseFrequency=".01" numOctaves="4"/>
<feColorMatrix values="0 0 0 0 0, 0 0 0 0 0, 0 0 0 0 0, 0 0 0 -0.9 1.2" result="texture"/>
<feComposite in="SourceGraphic" in2="texture" operator="in"/>
</filter>
<filter id="bluredSplotch">
<feTurbulence type="fractalNoise" baseFrequency=".01" numOctaves="4"/>
<feColorMatrix values="0 0 0 0 0, 0 0 0 0 0, 0 0 0 0 0, 0 0 0 -0.9 1.2" result="texture"/>
<feComposite in="SourceGraphic" in2="texture" operator="in"/>
<feGaussianBlur stdDeviation="4"/>
</filter>
<filter id="dropShadow"> <filter id="dropShadow">
<feGaussianBlur in="SourceAlpha" stdDeviation="2"/> <feGaussianBlur in="SourceAlpha" stdDeviation="2"/>
<feOffset dx="1" dy="2"/> <feOffset dx="1" dy="2"/>
@ -59,24 +71,31 @@
<feMergeNode in="SourceGraphic"/> <feMergeNode in="SourceGraphic"/>
</feMerge> </feMerge>
</filter> </filter>
<filter id="pencil">
<feTurbulence baseFrequency="0.03" numOctaves="6" type="fractalNoise"/>
<feDisplacementMap scale="3" in="SourceGraphic" xChannelSelector="R" yChannelSelector="G"/>
</filter>
<filter id="turbulence">
<feTurbulence baseFrequency="0.1" numOctaves="3" type="fractalNoise"/>
<feDisplacementMap scale="10" in="SourceGraphic" xChannelSelector="R" yChannelSelector="G"/>
</filter>
<filter id="filter-grayscale"> <filter id="filter-grayscale">
<feColorMatrix type="matrix" values="0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"/> <feColorMatrix values="0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"/>
</filter> </filter>
<filter id="filter-sepia"> <filter id="filter-sepia">
<feColorMatrix type="matrix" values="0.393 0.769 0.189 0 0 0.349 0.686 0.168 0 0 0.272 0.534 0.131 0 0 0 0 0 1 0"/> <feColorMatrix values="0.393 0.769 0.189 0 0 0.349 0.686 0.168 0 0 0.272 0.534 0.131 0 0 0 0 0 1 0"/>
</filter> </filter>
<filter id="filter-dingy"> <filter id="filter-dingy">
<feColorMatrix type="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0.3 0.3 0 0 0 0 0 1 0"/> <feColorMatrix values="1 0 0 0 0 0 1 0 0 0 0 0.3 0.3 0 0 0 0 0 1 0"/>
</filter> </filter>
<filter id="filter-tint"> <filter id="filter-tint">
<feColorMatrix type="matrix" values="0 0.9 0.2 0 0 0 0.8 0.1 0 0.1 0 0.4 1.4 0 -0.1 0 0 0 1 1"/> <feColorMatrix values="1.1 0 0 0 0 0 1.1 0 0 0 0 0 0.9 0 0 0 0 0 1 0"/>
</filter> </filter>
<g id="deftemp">
<mask id="shape" x="0" y="0" width="100%" height="100%" fill="black"></mask>
</g> </g>
<g id="deftemp"></g>
<g id="defs-icons"> <g id="defs-icons">
<symbol id="icon-anchor" viewBox="0 0 30 29"> <symbol id="icon-anchor" viewBox="0 0 30 29">
<title>Anchor</title> <title>Port</title>
<path d="M15 4c0-0.547-0.453-1-1-1s-1 0.453-1 1 0.453 1 1 1 1-0.453 1-1zM28 18.5v5.5c0 0.203-0.125 0.391-0.313 0.469-0.063 0.016-0.125 0.031-0.187 0.031-0.125 0-0.25-0.047-0.359-0.141l-1.453-1.453c-2.453 2.953-6.859 4.844-11.688 4.844s-9.234-1.891-11.688-4.844l-1.453 1.453c-0.094 0.094-0.234 0.141-0.359 0.141-0.063 0-0.125-0.016-0.187-0.031-0.187-0.078-0.313-0.266-0.313-0.469v-5.5c0-0.281 0.219-0.5 0.5-0.5h5.5c0.203 0 0.391 0.125 0.469 0.313s0.031 0.391-0.109 0.547l-1.563 1.563c1.406 1.891 4.109 3.266 7.203 3.687v-10.109h-3c-0.547 0-1-0.453-1-1v-2c0-0.547 0.453-1 1-1h3v-2.547c-1.188-0.688-2-1.969-2-3.453 0-2.203 1.797-4 4-4s4 1.797 4 4c0 1.484-0.812 2.766-2 3.453v2.547h3c0.547 0 1 0.453 1 1v2c0 0.547-0.453 1-1 1h-3v10.109c3.094-0.422 5.797-1.797 7.203-3.687l-1.563-1.563c-0.141-0.156-0.187-0.359-0.109-0.547s0.266-0.313 0.469-0.313h5.5c0.281 0 0.5 0.219 0.5 0.5z"></path> <path d="M15 4c0-0.547-0.453-1-1-1s-1 0.453-1 1 0.453 1 1 1 1-0.453 1-1zM28 18.5v5.5c0 0.203-0.125 0.391-0.313 0.469-0.063 0.016-0.125 0.031-0.187 0.031-0.125 0-0.25-0.047-0.359-0.141l-1.453-1.453c-2.453 2.953-6.859 4.844-11.688 4.844s-9.234-1.891-11.688-4.844l-1.453 1.453c-0.094 0.094-0.234 0.141-0.359 0.141-0.063 0-0.125-0.016-0.187-0.031-0.187-0.078-0.313-0.266-0.313-0.469v-5.5c0-0.281 0.219-0.5 0.5-0.5h5.5c0.203 0 0.391 0.125 0.469 0.313s0.031 0.391-0.109 0.547l-1.563 1.563c1.406 1.891 4.109 3.266 7.203 3.687v-10.109h-3c-0.547 0-1-0.453-1-1v-2c0-0.547 0.453-1 1-1h3v-2.547c-1.188-0.688-2-1.969-2-3.453 0-2.203 1.797-4 4-4s4 1.797 4 4c0 1.484-0.812 2.766-2 3.453v2.547h3c0.547 0 1 0.453 1 1v2c0 0.547-0.453 1-1 1h-3v10.109c3.094-0.422 5.797-1.797 7.203-3.687l-1.563-1.563c-0.141-0.156-0.187-0.359-0.109-0.547s0.266-0.313 0.469-0.313h5.5c0.281 0 0.5 0.219 0.5 0.5z"></path>
</symbol> </symbol>
</g> </g>
@ -140,14 +159,14 @@
<div id="loading"> <div id="loading">
<div id="title_name">Azgaar's</div> <div id="title_name">Azgaar's</div>
<div id="title">Fantasy Map Generator</div> <div id="title">Fantasy Map Generator</div>
<div id="version">v. 0.57b</div> <div id="version">v. 0.59b</div>
<p id="loading-text">LOADING<span>.</span><span>.</span><span>.</span></p> <p id="loading-text">LOADING<span>.</span><span>.</span><span>.</span></p>
</div> </div>
<canvas id="canvas" style="opacity: 0"></canvas> <canvas id="canvas" style="opacity: 0"></canvas>
<div id="optionsContainer" class="hidden"> <div id="optionsContainer" class="hidden">
<div id="collapsible"> <div id="collapsible">
<button id="optionsTrigger" onmouseover="tip('Click to toggle options')" class="options icon-right-open glow"></button> <button id="optionsTrigger" onmouseover="tip('Click to toggle options. Hotkey: O')" class="options icon-right-open glow"></button>
<button id="regenerate" onmouseover="tip('Click to generate a new map')" class="options">New Map!</button> <button id="regenerate" onmouseover="tip('Click to generate a new map. Hotkey: F6')" class="options">New Map!</button>
</div> </div>
<div id="options"> <div id="options">
<div class="drag-trigger" onmouseover="tip('Drag to move options pane')"></div> <div class="drag-trigger" onmouseover="tip('Drag to move options pane')"></div>
@ -183,35 +202,37 @@
<li onmouseover="tip('Toggle Icons')" id="toggleIcons" onclick="$('#icons').fadeToggle()">Icons</li> <li onmouseover="tip('Toggle Icons')" id="toggleIcons" onclick="$('#icons').fadeToggle()">Icons</li>
</ul> </ul>
<div id="layoutCheckboxes"> <div id="layoutCheckboxes">
<input id="hideLabels" class="checkbox" type="checkbox" checked>
<label for="hideLabels" onmouseover="tip('Hide small labels (zoom in to show)')" class="checkbox-label">Hide small labels</label>
<input id="toggleTooltips" class="checkbox" type="checkbox" checked onclick="$('#tooltip').fadeToggle()"> <input id="toggleTooltips" class="checkbox" type="checkbox" checked onclick="$('#tooltip').fadeToggle()">
<label for="toggleTooltips" onmouseover="tip('Toogle tooltip line')" class="checkbox-label">Show tooltips</label> <label for="toggleTooltips" onmouseover="tip('Toogle tooltip line')" class="checkbox-label">Show tooltips</label>
<label id="optionSeedLabel" style="margin-left:10px">Map seed:
<input id="optionsSeed" class="pureInput" style="width:50px" value="">
<i onmouseover="tip('Click to generate a map for this seed')" id="optionsSeedGenerate" style="margin-left:-3px; color: #5d4651" class="icon-play"></i>
</label>
</div> </div>
</div> </div>
<div id="styleContent" class="tabcontent"> <div id="styleContent" class="tabcontent">
<p style="display: inline-block;">Select element:</p> <p style="display: inline-block;">Select element:</p>
<select id="styleElementSelect"> <select id="styleElementSelect">
<option value="oceanBase" selected>Ocean</option>
<option value="landmass">Landmass</option>
<option value="grid">Grid</option> <option value="grid">Grid</option>
<option value="overlay">Overlay</option> <option value="neutralBorders">Borders (neutral)</option>
<option value="terrs">Heightmap</option> <option value="stateBorders">Borders (state)</option>
<option value="coastline">Coastline</option>
<option value="regions">Countries</option>
<option value="cults">Cultures</option> <option value="cults">Cultures</option>
<option value="terrs">Heightmap</option>
<option value="icons">Icons</option>
<option value="labels">Labels</option>
<option value="lakes">Lakes</option>
<option value="landmass">Landmass</option>
<option value="ocean" selected>Ocean</option>
<option value="overlay">Overlay</option>
<option value="terrain">Relief</option>
<option value="rivers">Rivers</option>
<option value="roads">Roads</option> <option value="roads">Roads</option>
<option value="ruler">Rulers</option>
<option value="trails">Trails</option> <option value="trails">Trails</option>
<option value="searoutes">Searoutes</option> <option value="searoutes">Searoutes</option>
<option value="rivers">Rivers</option>
<option value="terrain">Relief</option>
<option value="regions">Countries</option>
<option value="stateBorders">State Borders</option>
<option value="neutralBorders">Neutral Borders</option>
<option value="coastline">Coastline</option>
<option value="lakes">Lakes</option>
<option value="labels">Labels</option>
<option value="icons">Icons</option>
<option value="scaleBar">Scale bar</option> <option value="scaleBar">Scale bar</option>
<option value="ruler">Rulers</option>
</select> </select>
<i id="restoreStyle" onmouseover="tip('Restore default style')" class="icon-ccw"></i> <i id="restoreStyle" onmouseover="tip('Restore default style')" class="icon-ccw"></i>
<div id="styleInputs"> <div id="styleInputs">
@ -225,6 +246,15 @@
<br>Size: <input id="styleOverlaySize" type="range" min="2" max="20" step="0.2" value="5"> <br>Size: <input id="styleOverlaySize" type="range" min="2" max="20" step="0.2" value="5">
<output id="styleOverlaySizeOutput">5</output> <output id="styleOverlaySizeOutput">5</output>
</div> </div>
<div id="styleOcean">
<br>Elements:
<input id="styleOceanPattern" class="checkbox" type="checkbox" checked>
<label for="styleOceanPattern" onmouseover="tip('Toggle ocean pattern')" class="checkbox-label">Pattern</label>
<input id="styleOceanLayers" class="checkbox" type="checkbox" checked>
<label for="styleOceanLayers" onmouseover="tip('Toggle ocean layers')" class="checkbox-label">Layers</label><br>
Background: <input id="styleOceanBack" type="color" value="#000000"/><output id="styleOceanBackOutput">#000000</output><br>
Foreground: <input id="styleOceanFore" type="color" value="#53679f"/><output id="styleOceanForeOutput">#53679f</output>
</div>
<div id="styleFill"> <div id="styleFill">
Fill: <input id="styleFillInput" type="color" value="#5E4FA2"/> Fill: <input id="styleFillInput" type="color" value="#5E4FA2"/>
<output id="styleFillOutput">#5E4FA2</output> <output id="styleFillOutput">#5E4FA2</output>
@ -233,7 +263,6 @@
Stroke: <input id="styleStrokeInput" type="color" value="#5E4FA2"/> Stroke: <input id="styleStrokeInput" type="color" value="#5E4FA2"/>
<output id="styleStrokeOutput">#5E4FA2</output> <output id="styleStrokeOutput">#5E4FA2</output>
</div> </div>
<div id="styleMultiple">Colors:</div>
<div id="styleStrokeWidth"> <div id="styleStrokeWidth">
<br>Stroke width: <input id="styleStrokeWidthInput" type="range" min="0" max="3" step="0.01" value="1"> <br>Stroke width: <input id="styleStrokeWidthInput" type="range" min="0" max="3" step="0.01" value="1">
<output id="styleStrokeWidthOutput">1</output> <output id="styleStrokeWidthOutput">1</output>
@ -250,11 +279,11 @@
</select> </select>
</div> </div>
<div id="styleFontSize"> <div id="styleFontSize">
<br>Font size: <button onmouseover="tip('Multiply all Fonts size by 1.1')" id="styleFontPlus">+</button><button onmouseover="tip('Multiply all Fonts size by 0.9')" id="styleFontMinus">-</button> <br>Font size: <button class="whiteButton" onmouseover="tip('Multiply all Fonts size by 1.1')" id="styleFontPlus">+</button><button class="whiteButton" onmouseover="tip('Multiply all Fonts size by 0.9')" id="styleFontMinus">-</button>
</div> </div>
<div id="styleSize"> <div id="styleSize">
<br>Radius: <button onmouseover="tip('Multiply Radius by 1.1')" id="styleFillPlus">+</button><button onmouseover="tip('Multiply Radius by 0.9')" id="styleFillMinus">-</button> <br>Radius: <button class="whiteButton" onmouseover="tip('Multiply Radius by 1.1')" id="styleFillPlus">+</button><button class="whiteButton" onmouseover="tip('Multiply Radius by 0.9')" id="styleFillMinus">-</button>
<span> Stroke: </span><button onmouseover="tip('Multiply Stroke-width by 1.1')" id="styleStrokePlus">+</button><button onmouseover="tip('Multiply Stroke-width by 0.9')" id="styleStrokeMinus">-</button> <span> Stroke: </span><button class="whiteButton" onmouseover="tip('Multiply Stroke-width by 1.1')" id="styleStrokePlus">+</button><button class="whiteButton" onmouseover="tip('Multiply Stroke-width by 0.9')" id="styleStrokeMinus">-</button>
</div> </div>
<div id="styleOpacity"> <div id="styleOpacity">
<br>Opacity: <input id="styleOpacityInput" type="range" min="0" max="1" step="0.01" value="1"> <br>Opacity: <input id="styleOpacityInput" type="range" min="0" max="1" step="0.01" value="1">
@ -267,7 +296,11 @@
<option value="url(#blur1)">Blur 1</option> <option value="url(#blur1)">Blur 1</option>
<option value="url(#blur5)">Blur 5</option> <option value="url(#blur5)">Blur 5</option>
<option value="url(#blur10)">Blur 10</option> <option value="url(#blur10)">Blur 10</option>
<option value="url(#splotch)">Splotch</option>
<option value="url(#bluredSplotch)">Blured Splotch</option>
<option value="url(#dropShadow)">Shadow</option> <option value="url(#dropShadow)">Shadow</option>
<option value="url(#pencil)">Pencil</option>
<option value="url(#turbulence)">Turbulence</option>
</select> </select>
</div> </div>
<div id="styleScheme"> <div id="styleScheme">
@ -278,6 +311,14 @@
<option value="monochrome">Monochrome</option> <option value="monochrome">Monochrome</option>
</select> </select>
</div> </div>
<div id="styleLabelGroups">
<fieldset>
<legend>Label groups:</legend>
<input id="hideLabels" class="checkbox" type="checkbox" checked>
<label for="hideLabels" onmouseover="tip('Allow system to hide labels if their size in too small on that scale)')" class="checkbox-label">Toogle visibility automatically</label>
<div id="styleLabelGroupItems"></div>
</fieldset>
</div>
</div> </div>
<div id="mapFilters"> <div id="mapFilters">
<p>Toggle filters:</p> <p>Toggle filters:</p>
@ -288,7 +329,7 @@
</div> </div>
</div> </div>
<div id="optionsContent" class="tabcontent"> <div id="optionsContent" class="tabcontent">
<p onmouseover="tip('Map generation setting. Generate new map to apply the settings')">Generation options (new map to apply):</p> <p onmouseover="tip('Map generation setting. Generate a new map to apply the settings')">Generation options (new map to apply):</p>
<table> <table>
<tr> <tr>
<td></td> <td></td>
@ -326,6 +367,8 @@
<option value="Continents">Continents</option> <option value="Continents">Continents</option>
<option value="Archipelago">Archipelago</option> <option value="Archipelago">Archipelago</option>
<option value="Atoll">Atoll</option> <option value="Atoll">Atoll</option>
<option value="Mainland">Mainland</option>
<option value="Peninsulas">Peninsulas</option>
</select> </select>
</td> </td>
<td></td> <td></td>
@ -370,7 +413,7 @@
<td> <td>
<i onmouseover="tip('Unlock to allow option randomization on new map generation')" data-locked=1 id="lockNeutralInput" class="icon-lock"></i> <i onmouseover="tip('Unlock to allow option randomization on new map generation')" data-locked=1 id="lockNeutralInput" class="icon-lock"></i>
</td> </td>
<td onmouseover="tip('Distance to a consider a land as neutral')">Neutral distance</td> <td onmouseover="tip('Manimal distance to closest burg to consider land neutral')">Neutral distance</td>
<td> <td>
<input id="neutralInput" type="range" min="1" max="500" step="1" value="200"> <input id="neutralInput" type="range" min="1" max="500" step="1" value="200">
</td> </td>
@ -378,6 +421,31 @@
<output id="neutralOutput">200</output> <output id="neutralOutput">200</output>
</td> </td>
</tr> </tr>
<tr style="display:none">
<td>
<i onmouseover="tip('Unlock to allow option randomization on new map generation')" data-locked=1 id="lockNamesInput" class="icon-lock"></i>
</td>
<td onmouseover="tip('Define name generation style for burgs. Only the first one works offline')">Burg names style</td>
<td>
<select id="namesInput">
<option value=0>Pseudo-real (Culture based simulation; internal generation)</option>
<option value=1>High Fantasy (English only; external resource)</option>
</select>
</td>
<td></td>
</tr>
<tr>
<td>
<i onmouseover="tip('Lock to restrict option randomization on new map generation')" data-locked=0 id="lockCulturesInput" class="icon-lock-open"></i>
</td>
<td onmouseover="tip('Define how many Cultures should be generated')">Cultures count</td>
<td>
<input id="culturesInput" type="range" min="1" max="13" value="7">
</td>
<td>
<output id="culturesOutput">7</output>
</td>
</tr>
<tr> <tr>
<td> <td>
<i onmouseover="tip('Lock to restrict option randomization on new map generation')" data-locked=0 id="lockPrecInput" class="icon-lock-open"></i> <i onmouseover="tip('Lock to restrict option randomization on new map generation')" data-locked=0 id="lockPrecInput" class="icon-lock-open"></i>
@ -406,14 +474,14 @@
<td></td> <td></td>
<td onmouseover="tip('Define the coast outline contours scheme')">Ocean layers</td> <td onmouseover="tip('Define the coast outline contours scheme')">Ocean layers</td>
<td> <td>
<select id="outlineLayers"> <select id="outlineLayersInput">
<option value="random" selected>Random</option> <option value="random">Random</option>
<option value="-6,-3,-1">-6,-3,-1</option> <option value="none">No outline</option>
<option value="-9,-6,-3,-1">-9,-6,-3,-1</option> <option value="-6,-3,-1" selected>Standard 3</option>
<option value="-6,-5,-4,-3,-2,-1">-6,-5,-4,-3,-2,-1</option> <option value="-6,-4,-2">Indented 3</option>
<option value="-9,-8,-7,-6,-5,-4,-3,-2,-1">-9,-8,-7,-6,-5,-4,-3,-2,-1</option> <option value="-9,-6,-3,-1">Standard 4</option>
<option value="-6,-4,-2">-6,-4,-2</option> <option value="-6,-5,-4,-3,-2,-1">Smooth 6</option>
<option value="-8,-6,-4,-2">-8,-6,-4,-2</option> <option value="-9,-8,-7,-6,-5,-4,-3,-2,-1">Smooth 9</option>
</select> </select>
</td> </td>
<td></td> <td></td>
@ -421,11 +489,21 @@
</table> </table>
<p onmouseover="tip('Generator settings. Getting applied immediately on change')">Generator settings:</p> <p onmouseover="tip('Generator settings. Getting applied immediately on change')">Generator settings:</p>
<table> <table>
<tr>
<td></td>
<td onmouseover="tip('Set dialog and tool windows transparency')">Transparency</td>
<td>
<input id="transparencyInput" type="range" min="0" max="100" value="0" oninput="transparencyOutput.value = this.value">
</td>
<td>
<output id="transparencyOutput">0</output>
</td>
</tr>
<tr> <tr>
<td></td> <td></td>
<td onmouseover="tip('Define relative size of a saved png images. Consider saving big images is slow')">PNG resolution</td> <td onmouseover="tip('Define relative size of a saved png images. Consider saving big images is slow')">PNG resolution</td>
<td> <td>
<input id="pngResolution" type="range" min="1" max="10" value="5" oninput="pngResolutionOutput.value = this.value + 'x'"> <input id="pngResolutionInput" type="range" min="1" max="10" value="5" oninput="pngResolutionOutput.value = this.value + 'x'">
</td> </td>
<td> <td>
<output id="pngResolutionOutput">5x</output> <output id="pngResolutionOutput">5x</output>
@ -433,7 +511,7 @@
</tr> </tr>
<tr> <tr>
<td></td> <td></td>
<td onmouseover="tip('Set default zoom extent')">Zoom extent</td> <td onmouseover="tip('Set mininum and maximum zoom level')">Zoom extent</td>
<td style="width: 130px;"> <td style="width: 130px;">
<span onmouseover="tip('Zoom out limit')">o:</span> <span onmouseover="tip('Zoom out limit')">o:</span>
<input class="pairedNumber" id="zoomExtentMin" type="number" min="0.2" step="0.1" max="20" value="1"> <input class="pairedNumber" id="zoomExtentMin" type="number" min="0.2" step="0.1" max="20" value="1">
@ -445,12 +523,14 @@
</td> </td>
</tr> </tr>
</table> </table>
<button id="optionsReset" onmouseover="tip('Click to restore default options')">Reset Defaults</button>
</div> </div>
<div id="customizeContent" class="tabcontent" style="display: block;"> <div id="customizeContent" class="tabcontent" style="display: block;">
<div id="openEditor"> <div id="openEditor">
<p>Customize:</p> <p>Customize:</p>
<button id="editHeightmap" onmouseover="tip('Click to open Heightmap customization menu')">Heightmap</button> <button id="editHeightmap" onmouseover="tip('Click to open Heightmap customization menu')">Heightmap</button>
<button id="editCountries" onmouseover="tip('Click to open Countries Editor')">Countries</button> <button id="editCountries" onmouseover="tip('Click to open Countries Editor')">Countries</button>
<button id="editCultures" onmouseover="tip('Click to open Cultures Editor')">Cultures</button>
<button id="editScale" onmouseover="tip('Click to open Scale Editor')">Scale</button> <button id="editScale" onmouseover="tip('Click to open Scale Editor')">Scale</button>
</div> </div>
<div id="customizeHeightmap" style="display: none;"> <div id="customizeHeightmap" style="display: none;">
@ -458,7 +538,7 @@
<div> <div>
<button onmouseover="tip('Edit the current Heightmap')" id="fromHeightmap">Edit</button> <button onmouseover="tip('Edit the current Heightmap')" id="fromHeightmap">Edit</button>
<button onmouseover="tip('Remove all data and start from scratch')" id="fromScratch">Clear all</button> <button onmouseover="tip('Remove all data and start from scratch')" id="fromScratch">Clear all</button>
<button class="buttonoff" onmouseover="tip('Finalize the Heightmap. Not allowed if landmass area is insufficient')" id="getMap" disabled="disabled">Complete</button> <button class="buttonoff" onmouseover="tip('Finalize the Heightmap. Not allowed if landmass area is insufficient')" id="getMap">Complete</button>
</div> </div>
<div id="customizationMenu" class="hidden"> <div id="customizationMenu" class="hidden">
<div id="customizeTools"> <div id="customizeTools">
@ -468,7 +548,15 @@
<button onmouseover="tip('Open Image Converter')" id="convertImage">Image Converter</button> <button onmouseover="tip('Open Image Converter')" id="convertImage">Image Converter</button>
<button onmouseover="tip('Show Heightmap in perspective')" id="perspectiveView">Perspective View</button> <button onmouseover="tip('Show Heightmap in perspective')" id="perspectiveView">Perspective View</button>
</div> </div>
<label onmouseover="tip('Number of Land cells and landmass/ocean ratio')">Landmass: <span id="landmassCounter">0</span></label><hr> <div id="customizeOptions">
<input id="renderOcean" class="checkbox" type="checkbox">
<label for="renderOcean" onmouseover="tip('Render cells below sea level')" class="checkbox-label">Render ocean cells</label>
<input id="changeHeights" class="checkbox" type="checkbox" checked>
<label for="changeHeights" onmouseover="tip('Allow system to change custom heights if reasonable')" class="checkbox-label">Change heights</label>
</div>
<label onmouseover="tip('Number of Land cells and landmass/ocean ratio')">Landmass:
<span id="landmassCounter">0</span> (<span id="landmassRatio">0</span>%); Average Elevation: <span id="landmassAverage">0</span>
</label><hr>
</div> </div>
</div> </div>
<div id="addFeature"> <div id="addFeature">
@ -484,6 +572,7 @@
<div> <div>
Coord: <span id="infoX">0</span>/<span id="infoY">0</span><br> Coord: <span id="infoX">0</span>/<span id="infoY">0</span><br>
Cell: <span id="infoCell">0</span><br> Cell: <span id="infoCell">0</span><br>
Area: <span id="infoArea">0</span><br>
Height: <span id="infoHeight">0</span><br> Height: <span id="infoHeight">0</span><br>
Flux: <span id="infoFlux">0</span> Flux: <span id="infoFlux">0</span>
</div> </div>
@ -491,36 +580,38 @@
Type: <span id="infoFeature">n/a</span><br> Type: <span id="infoFeature">n/a</span><br>
Country: <span id="infoCountry">n/a</span><br> Country: <span id="infoCountry">n/a</span><br>
Culture: <span id="infoCulture">n/a</span><br> Culture: <span id="infoCulture">n/a</span><br>
Population: <span id="infoPopulation">0</span><br>
Burg: <span id="infoBurg">n/a</span> Burg: <span id="infoBurg">n/a</span>
</div> </div>
</div> </div>
</div> </div>
<div id="aboutContent" class="tabcontent"> <div id="aboutContent" class="tabcontent">
<p><a href="https://github.com/Azgaar/Fantasy-Map-Generator" target="_blank">Fantasy Map Generator</a> is an <a href="https://github.com/Azgaar/Fantasy-Map-Generator/blob/master/LICENSE" target="_blank">open source</a> tool which procedurally generates fantasy maps. You may either use an auto-generated maps or create your own map manually or with a help of templates or image converter. Check out the <a href="https://github.com/Azgaar/Fantasy-Map-Generator/wiki/Quick-Start-Tutorial" target="_blank">quick start tutorial</a> and <a href="https://github.com/Azgaar/Fantasy-Map-Generator/wiki" target="_blank">project wiki</a> for guidance.</p> <p><a href="https://github.com/Azgaar/Fantasy-Map-Generator" target="_blank">Fantasy Map Generator</a> is an <a href="https://github.com/Azgaar/Fantasy-Map-Generator/blob/master/LICENSE" target="_blank">open source</a> tool which procedurally generates fantasy maps. You may use auto-generated maps as they are, edit them or even create a map from scratch. Check out the <a href="https://github.com/Azgaar/Fantasy-Map-Generator/wiki/Quick-Start-Tutorial" target="_blank">quick start tutorial</a> and <a href="https://github.com/Azgaar/Fantasy-Map-Generator/wiki" target="_blank">project wiki</a> for guidance. Join our <a href="https://www.reddit.com/r/FantasyMapGenerator/" target="_blank">Reddit Community</a> if you have questions, need any help, have a suggestion or just want to share a created map.</p>
<p>This is a Demo version, the Generator is still under development. For older versions see the <a href="https://github.com/Azgaar/Fantasy-Map-Generator/wiki/Changelog" target="_blank">changelog</a>. Some details are covered in my <a href="https://azgaar.wordpress.com/" target="_blank">blog</a>. To track the current progress see the <a href="https://trello.com/b/7x832DG4/fantasy-map-generator" target="_blank">devboard</a>.</p> <p>The project is under active development. For older versions see the <a href="https://github.com/Azgaar/Fantasy-Map-Generator/wiki/Changelog" target="_blank">changelog</a>. Some details are covered in my <a href="https://azgaar.wordpress.com/" target="_blank">blog</a>. To track the current progress see the <a href="https://trello.com/b/7x832DG4/fantasy-map-generator" target="_blank">devboard</a>.</p>
<p>Please report bugs and suggest new features <a href="https://github.com/Azgaar/Fantasy-Map-Generator/issues" target="_blank">here</a>. You may also <a href="mailto:maxganiev@yandex.ru">send me</a> an email.</p> <p>Please report bugs <a href="https://github.com/Azgaar/Fantasy-Map-Generator/issues" target="_blank">here</a>. You may also <a href="mailto:maxganiev@yandex.ru" target="_blank">send me</a> an email.</p>
<ul class="share-buttons"> <ul class="share-buttons">
<li><a href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fazgaar.github.io%2FFantasy-Map-Generator%2F&quote=" onmouseover="tip('Share on Facebook')" target="_blank"><img alt="Share on Facebook" src="images/Facebook.png" /></a></li> <li><a href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fazgaar.github.io%2FFantasy-Map-Generator%2F&quote=" onmouseover="tip('Share on Facebook')" target="_blank"><img alt="Share on Facebook" src="images/Facebook.png" /></a></li>
<li><a href="https://twitter.com/intent/tweet?source=https%3A%2F%2Fazgaar.github.io%2FFantasy-Map-Generator%2F&text=:%20https%3A%2F%2Fazgaar.github.io%2FFantasy-Map-Generator%2F" target="_blank" onmouseover="tip('Tweet')"><img alt="Tweet" src="images/Twitter.png" /></a></li> <li><a href="https://twitter.com/intent/tweet?source=https%3A%2F%2Fazgaar.github.io%2FFantasy-Map-Generator&text=%23FantasyMapGenerator%0A%0Ahttps%3A//azgaar.github.io/Fantasy-Map-Generator" target="_blank" onmouseover="tip('Tweet')"><img alt="Tweet" src="images/Twitter.png" /></a></li>
<li><a href="http://www.tumblr.com/share?v=3&u=https%3A%2F%2Fazgaar.github.io%2FFantasy-Map-Generator%2F&quote=&s=" target="_blank" onmouseover="tip('Post to Tumblr')"><img alt="Post to Tumblr" src="images/Tumblr.png" /></a></li> <li><a href="http://www.tumblr.com/share?v=3&u=https%3A%2F%2Fazgaar.github.io%2FFantasy-Map-Generator" target="_blank" onmouseover="tip('Post to Tumblr')"><img alt="Post to Tumblr" src="images/Tumblr.png" /></a></li>
<li><a href="http://pinterest.com/pin/create/button/?url=https%3A%2F%2Fazgaar.github.io%2FFantasy-Map-Generator%2F&description=" target="_blank" onmouseover="tip('Pin it')"><img alt="Pin it" src="images/Pinterest.png" /></a></li> <li><a href="http://pinterest.com/pin/create/button/?url=https%3A%2F%2Fazgaar.github.io%2FFantasy-Map-Generator" target="_blank" onmouseover="tip('Pin it')"><img alt="Pin it" src="images/Pinterest.png" /></a></li>
<li><a href="http://www.reddit.com/submit?url=https%3A%2F%2Fazgaar.github.io%2FFantasy-Map-Generator" target="_blank" onmouseover="tip('Submit to Reddit')"><img alt="Submit to Reddit" src="images/Reddit.png" /></a></li> <li><a href="http://www.reddit.com/submit?url=https%3A%2F%2Fazgaar.github.io%2FFantasy-Map-Generator" target="_blank" onmouseover="tip('Submit to Reddit')"><img alt="Submit to Reddit" src="images/Reddit.png" /></a></li>
</ul> </ul>
</div> </div>
<div id="sticked"> <div id="sticked">
<button id="randomMap" onmouseover="tip('Generate new random map based on options being set (F2)')" class="options">New Map</button> <button id="randomMap" onmouseover="tip('Generate a new map based on options. May take about 1 minute. Hotkey: F6')" class="options">New Map</button>
<button id="saveButton" onmouseover="tip('Select file format to save map')" class="options">Save as</button> <button id="saveButton" onmouseover="tip('Select file format to save map')" class="options">Save as</button>
<div id="saveDropdown"> <div id="saveDropdown">
<div id="saveMap" onmouseover="tip('Save as fully functional map in .map format')">.map</div> <div id="saveMap" onmouseover="tip('Save as fully functional map in .map format. Hotkey: M')">.map</div>
<div id="saveSVG" onmouseover="tip('Download the map as .svg image (open derectly in browser or in vector editor like Inkscape)')">.svg</div> <div id="saveSVG" onmouseover="tip('Download the map as .svg image (open in browser or in Inkscape. Hotkey: S)')">.svg</div>
<div id="savePNG" onmouseover="tip('Download the visible part of the map as 4K .png image. Please ensure popups are not blocked!')">.png</div> <div id="savePNG" onmouseover="tip('Download the visible part of the map as 4K .png image. Please ensure popups are not blocked! Hotkey: P')">.png</div>
</div> </div>
<button id="loadMap" onmouseover="tip('Load fully functional map in a .map format')" class="options">Load</button> <button id="loadMap" onmouseover="tip('Load fully functional map in a .map format. Hotkey: L')" class="options">Load</button>
<button id="zoomReset" onmouseover="tip('Reset map zoom to default')" class="options">Reset Zoom</button> <button id="zoomReset" onmouseover="tip('Reset map zoom. Hotkey: 0')" class="options">Reset Zoom</button>
</div> </div>
</div> </div>
</div> </div>
<div id="dialogs" style="background-color: #ffffff">
<div id="labelEditor" class="dialog" style="display: none"> <div id="labelEditor" class="dialog" style="display: none">
<button id="editGroupButton" onmouseover="tip('Edit label Group')" class="editButton icon-tags"></button> <button id="editGroupButton" onmouseover="tip('Edit label Group')" class="editButton icon-tags"></button>
<select id="editGroupSelect" onmouseover="tip('Select Group for this label')" class="editTrigger"></select> <select id="editGroupSelect" onmouseover="tip('Select Group for this label')" class="editTrigger"></select>
@ -693,13 +784,15 @@
<button id="burgFeatures" onmouseover="tip('Change Burg features')" class="icon-cog-alt"></button> <button id="burgFeatures" onmouseover="tip('Change Burg features')" class="icon-cog-alt"></button>
<div id="burgFeaturesSection" style="display: none"> <div id="burgFeaturesSection" style="display: none">
<button id="burgToggleCapital" onmouseover="tip('Mark the Burg as country capital. Neutral burg cannot be capital')" class="icon-star"></button> <button id="burgToggleCapital" onmouseover="tip('Mark the Burg as country capital. Neutral burg cannot be a capital')" class="icon-star"></button>
<button id="burgTogglePort" onmouseover="tip('Mark the Burg as port. Only coastal and riverine burgs can be ports')" class="icon-anchor"></button> <button id="burgTogglePort" onmouseover="tip('Mark the Burg as port (toggle anchor icon)')" class="icon-anchor"></button>
<i onmouseover="tip('Set Burg population')" class="icon-users"></i> <i onmouseover="tip('Set Burg population')" class="icon-users"></i>
<input id="burgPopulation" onmouseover="tip('Set Burg population (in population points)')" type="number" value="1" min="0" step="1" style="width: 40px;"></select> <input id="burgPopulation" onmouseover="tip('Set Burg population (in population points)')" type="number" value="1" min="0" step="1" style="width: 40px;"></select>
<output id="burgPopulationFriendly" onmouseover="tip('Burg population (in people)')">1000</output> <output id="burgPopulationFriendly" onmouseover="tip('Burg population (in people)')">1000</output>
</div> </div>
<button id="burgSeeInMFCG" onmouseover="tip('See the burg representation in Medieval Fantasy City Generator by watabou')" class="icon-map"></button>
<button id="burgRelocate" onmouseover="tip('Move burg to a different cell')" class="icon-target"></button>
<button id="burgAddfromEditor" onmouseover="tip('Add new Burg')" class="icon-plus"></button> <button id="burgAddfromEditor" onmouseover="tip('Add new Burg')" class="icon-plus"></button>
<button id="burgRemove" onmouseover="tip('Remove the Burg')" class="icon-trash"></button> <button id="burgRemove" onmouseover="tip('Remove the Burg')" class="icon-trash"></button>
</div> </div>
@ -714,6 +807,8 @@
<option value="templateContinents">Continents</option> <option value="templateContinents">Continents</option>
<option value="templateArchipelago">Archipelago</option> <option value="templateArchipelago">Archipelago</option>
<option value="templateAtoll">Atoll</option> <option value="templateAtoll">Atoll</option>
<option value="templateMainland">Mainland</option>
<option value="templatePeninsulas">Peninsulas</option>
</select> </select>
</div> </div>
<div id="templateTools"> <div id="templateTools">
@ -737,8 +832,9 @@
<button id="templateUndo" onmouseover="tip('Undo the latest action')" class="icon-ccw" disabled></button> <button id="templateUndo" onmouseover="tip('Undo the latest action')" class="icon-ccw" disabled></button>
<button id="templateRedo" onmouseover="tip('Redo the action')" class="icon-cw" disabled></button> <button id="templateRedo" onmouseover="tip('Redo the action')" class="icon-cw" disabled></button>
<button id="templateComplete" onmouseover="tip('Finalize the Heightmap. Not allowed if insufficient land area available')" class="icon-check"></button> <button id="templateComplete" onmouseover="tip('Finalize the Heightmap. Not allowed if insufficient land area available')" class="icon-check"></button>
<button id="templateLoad" onmouseover="tip('Open previously saved template')" class="icon-upload"></button>
<button id="templateSave" onmouseover="tip('Save template')" class="icon-download"></button> <button id="templateSave" onmouseover="tip('Save template')" class="icon-download"></button>
<button id="templateLoad" onmouseover="tip('Open previously saved template')" class="icon-upload"></button>
<button id="templateMail" onclick="window.open('mailto:maxganiev@yandex.com?Subject=Template%20suggestion', '_blank')" onmouseover="tip('Send a template suggestion to me')" class="icon-mail-alt"></button>
</div> </div>
</div> </div>
@ -781,9 +877,9 @@
</div> </div>
<div style="display: table;"> <div style="display: table;">
<label id="brushRadiusLabel" onmouseover="tip('Set the brush effective radius. Works only with 4 brushes above')" class="disabled italic">R:</label> <label id="brushRadiusLabel" onmouseover="tip('Set the brush effective radius. Works only with 4 brushes above')" class="disabled italic">R:</label>
<input id="brushRadius" onchange="this.title = this.value" type="range" min="1" max="10" value="3" class="disabled" disabled> <input id="brushRadius" oninput="tip('Brush radius: '+this.value)" type="range" min="1" max="10" value="3" class="disabled" disabled>
<label onmouseover="tip('Set the brush power')" class="italic">H:</label> <label onmouseover="tip('Set the brush power in points of height')" class="italic">H:</label>
<input id="brushPower" onchange="this.title = this.value" type="range" min="0.01" max="0.3" step="0.01" value="0.05"> <input id="brushPower" oninput="tip('Brush power: '+this.value)" type="range" min="1" max="30" value="5">
</div> </div>
<div id="modifyButtons"> <div id="modifyButtons">
<button id="undo" onmouseover="tip('Undo the latest action (Ctrl + Z)')" class="icon-ccw" disabled></button> <button id="undo" onmouseover="tip('Undo the latest action (Ctrl + Z)')" class="icon-ccw" disabled></button>
@ -792,9 +888,9 @@
<input id="rescaler" onmouseover="tip('Slide to change map height')" type="range" min="1" max="10" step="0.1" value="5" class="hidden"> <input id="rescaler" onmouseover="tip('Slide to change map height')" type="range" min="1" max="10" step="0.1" value="5" class="hidden">
<button id="rescaleCondButton" onmouseover="tip('Conditional rescaler')" class="icon-if"></button> <button id="rescaleCondButton" onmouseover="tip('Conditional rescaler')" class="icon-if"></button>
<label class="condition hidden">h ≥</label> <label class="condition hidden">h ≥</label>
<input id="rescaleLower" class="condition hidden" onmouseover="tip('Set lower threshold')" value="0.2" type="number" min="0" max="1" step="0.01"> <input id="rescaleLower" class="condition hidden" onmouseover="tip('Set lower threshold')" value="20" type="number" min="0" max="100">
<label class="condition hidden"></label> <label class="condition hidden"></label>
<input id="rescaleHigher" class="condition hidden" onmouseover="tip('Set higher threshold')" value="1" type="number" min="0.01" max="1" step="0.01"> <input id="rescaleHigher" class="condition hidden" onmouseover="tip('Set higher threshold')" value="100" type="number" min="1" max="100">
<label class="condition hidden"></label> <label class="condition hidden"></label>
<select class="condition hidden" id="conditionSign"> <select class="condition hidden" id="conditionSign">
<option value="×" selected>×</option> <option value="×" selected>×</option>
@ -812,20 +908,7 @@
</div> </div>
<div id="perspectivePanel" class="dialog stable" style="display: none"> <div id="perspectivePanel" class="dialog stable" style="display: none">
<div id="lineSlider" class="slider"> <canvas id="perspective" width="480" height="150"></canvas>
<div id="lineHandle0" class="ui-slider-handle" data-value=240></div>
<div id="lineHandle1" class="ui-slider-handle" data-value=90></div>
</div><br>
<div id="ySlider" class="slider">
<div id="yHandle" class="ui-slider-handle" data-value=4></div>
</div><br>
<div id="scaleSlider" class="slider">
<div id="scaleHandle" class="ui-slider-handle" data-value=1></div>
</div><br>
<div id="heightSlider" class="slider">
<div id="heightHandle" class="ui-slider-handle" data-value=30></div>
</div><br>
<canvas id="perspective" width="480" height="200"></canvas>
</div> </div>
<div id="countriesEditor" class="dialog stable" style="display: none" data-type="absolute"> <div id="countriesEditor" class="dialog stable" style="display: none" data-type="absolute">
@ -854,17 +937,20 @@
<button id="countriesManuallyComplete" onmouseover="tip('Apply assignment')" class="icon-check"></button> <button id="countriesManuallyComplete" onmouseover="tip('Apply assignment')" class="icon-check"></button>
<button id="countriesAddM" onmouseover="tip('Proclaim a new country')" class="icon-flag"></button> <button id="countriesAddM" onmouseover="tip('Proclaim a new country')" class="icon-flag"></button>
<button id="countriesManuallyCancel" onmouseover="tip('Cancel assignment')" class="icon-cancel"></button> <button id="countriesManuallyCancel" onmouseover="tip('Cancel assignment')" class="icon-cancel"></button>
<label onmouseover="tip('Set the brush power')" class="italic">Brush size:</label> <label onmouseover="tip('Set the brush size')" class="italic">Brush size:</label>
<input id="countriesManuallyBrush" onchange="this.title = this.value" type="range" min="1" max="7" value="3"> <input id="countriesManuallyBrush" oninput="tip('Brush size: '+this.value); countriesManuallyBrushNumber.value = this.value" type="range" min="1" max="7" value="3">
<input id="countriesManuallyBrushNumber" oninput="tip('Brush size: '+this.value); countriesManuallyBrush.value = this.value" type="number" min="1" max="7" value="3">
</div> </div>
<div id="countriesRegenerateButtons" style="display: none"> <div id="countriesRegenerateButtons" style="display: none">
<button id="countriesApply" onmouseover="tip('Apply assignment')" class="icon-check"></button> <button id="countriesApply" onmouseover="tip('Apply assignment')" class="icon-check"></button>
<button id="countriesRandomize" onmouseover="tip('Randomize countries Expansion value')" class="icon-shuffle"></button> <button id="countriesRandomize" onmouseover="tip('Randomize countries Expansion value')" class="icon-shuffle"></button>
<button id="countriesAddR" onmouseover="tip('Proclaim a new country')" class="icon-flag"></button> <button id="countriesAddR" onmouseover="tip('Proclaim a new country')" class="icon-flag"></button>
<label onmouseover="tip('Distance to a consider a land as neutral')" class="italic">Neutral distance:</label> <label onmouseover="tip('Distance to a consider a land as neutral')" class="italic">Neutral distance:</label>
<input id="countriesNeutral" onchange="this.title = this.value" type="range" min="1" max="500" value="200"> <input id="countriesNeutral" oninput="tip('Neutral distance: '+this.value); countriesNeutralNumber.value = this.value" type="range" min="1" max="500" value="200">
<input id="countriesNeutralNumber" oninput="tip('Neutral distance: '+this.value); countriesNeutral.value = this.value" type="number" min="1" max="500" value="200" style="width:42px">
</div> </div>
<button id="countriesAddG" onmouseover="tip('Proclaim a new country')" class="icon-flag"></button> <button id="countriesAddG" onmouseover="tip('Proclaim a new country')" class="icon-flag"></button>
<button id="countriesRegenerateNames" onmouseover="tip('Regenerate countries names')" class="icon-arrows-cw"></button>
<button id="countriesExport" onmouseover="tip('Save country-related data as a text file (.csv)')" class="icon-download"></button> <button id="countriesExport" onmouseover="tip('Save country-related data as a text file (.csv)')" class="icon-download"></button>
<button id="burgNamesImport" onmouseover="tip('Load burg names from a text file. Each name should be on a new line!')" class="icon-upload"></button> <button id="burgNamesImport" onmouseover="tip('Load burg names from a text file. Each name should be on a new line!')" class="icon-upload"></button>
<button id="removeCountries" onmouseover="tip('Remove all countries')" class="icon-trash"></button> <button id="removeCountries" onmouseover="tip('Remove all countries')" class="icon-trash"></button>
@ -891,12 +977,85 @@
<div id="burgsBottom"> <div id="burgsBottom">
<button id="editScaleBurgs" onmouseover="tip('Change demographical and geographical measurements')" class="icon-map-signs"></button> <button id="editScaleBurgs" onmouseover="tip('Change demographical and geographical measurements')" class="icon-map-signs"></button>
<button id="changeCapital" onmouseover="tip('Click on a burg line to make it a new capital')" class="icon-star"></button> <button id="changeCapital" onmouseover="tip('Click on a burg line to make it a new capital')" class="icon-star"></button>
<button id="regenerateBurgNames" onmouseover="tip('Regenerate burg names')" class="icon-cog-alt"></button> <button id="regenerateBurgNames" onmouseover="tip('Regenerate burg names based on assigned culture')" class="icon-arrows-cw"></button>
<button id="burgAdd" onmouseover="tip('Add new burg')" class="icon-fort-awesome"></button> <button id="burgAdd" onmouseover="tip('Add new burg')" class="icon-fort-awesome"></button>
<button id="removeBurgs" onmouseover="tip('Remove all burgs')" class="icon-trash"></button> <button id="removeBurgs" onmouseover="tip('Remove all burgs')" class="icon-trash"></button>
</div> </div>
</div> </div>
<div id="culturesEditor" class="dialog stable" style="display: none" data-type="absolute">
<div id="culturesHeader">
<div style="margin-left: 14px" onmouseover="tip('Click to sort by culture name')" class="sortable alphabetically" data-sortby="culture">Culture&nbsp;</div>
<div style="margin-left: 16px" onmouseover="tip('Click to sort by culture cells count')" class="sortable" data-sortby="cells">Cells&nbsp;</div>
<div style="margin-left: 18px" onmouseover="tip('Click to sort by culture area')" class="sortable" data-sortby="area">Area&nbsp;</div>
<div style="margin-left: 30px" onmouseover="tip('Click to sort by culture population')" class="sortable" data-sortby="population">Population&nbsp;</div>
<div style="margin-left: 3px" onmouseover="tip('Click to sort by culture namesbase')" class="sortable alphabetically" data-sortby="base">Namesbase&nbsp;</div>
</div>
<div id="culturesBody"></div>
<div id="culturesFooter" class="totalLine">
<div onmouseover="tip('Cultures number (active / total)')" style="margin-left: 7px">Cultures:&nbsp;<span id="culturesFooterCultures">0 / 7</span></div>
<div onmouseover="tip('Total Land cells number')" style="margin-left: 7px">Cells:&nbsp;<span id="culturesFooterCells">0</span></div>
<div onmouseover="tip('Total Land Area')" style="margin-left: 7px">Area:&nbsp;<span id="culturesFooterArea">0</span></div>
<div onmouseover="tip('Total Population')" style="margin-left: 7px">Population:&nbsp;<span id="culturesFooterPopulation">0</span></div>
</div>
<div id="culturesBottom">
<button id="culturesPercentage" onmouseover="tip('Toggle percentage / absolut values views')" class="icon-percent"></button>
<button id="culturesManually" onmouseover="tip('Manually re-assign cultures')" class="icon-brush"></button>
<div id="culturesManuallyButtons" style="display: none">
<button id="culturesManuallyComplete" onmouseover="tip('Apply assignment')" class="icon-check"></button>
<button id="culturesManuallyCancel" onmouseover="tip('Cancel assignment')" class="icon-cancel"></button>
<label onmouseover="tip('Set the brush size')" class="italic">Brush size:</label>
<input id="culturesManuallyBrush" oninput="tip('Brush size: '+this.value); culturesManuallyBrushNumber.value = this.value" type="range" min="1" max="7" value="3">
<input id="culturesManuallyBrushNumber" oninput="tip('Brush size: '+this.value); culturesManuallyBrush.value = this.value" type="number" min="1" max="7" value="3">
</div>
<button id="culturesRandomize" onmouseover="tip('Randomly re-distribute cultures')" class="icon-shuffle"></button>
<button id="culturesRegenerateNames" onmouseover="tip('Re-generate all Burg names based on assigned culture')" class="icon-arrows-cw"></button>
<button id="culturesEditNamesBase" onmouseover="tip('Edit a database used for names generation')" class="icon-list-bullet"></button>
<button id="culturesAdd" onmouseover="tip('Add a new culture')" class="icon-plus"></button>
<button id="culturesExport" onmouseover="tip('Save cultures-related data as a text file (.csv)')" class="icon-download"></button>
</div>
</div>
<div id="namesbaseEditor" class="dialog stable" style="display: none">
<div id="namesbaseBasesTop">
<span>Select base: </span>
<select id="namesbaseSelect" onmouseover="tip('Select base to edit')" value="0"></select>
<span>Base name: </span>
<input id="namesbaseName" onmouseover="tip('Type to change a base name')" placeholder="Base name" autocorrect="off" spellcheck="false"/>
</div>
<div id="namesbaseBody">
<span>Names data:</span><br>
<textarea id="namesbaseTextarea" data-base="0" cols="70" rows="10" onmouseover="tip('Names data: a comma separated list of source names used for names generation')" placeholder="Provide a names data: a comma separated list of source names" autocorrect="off" spellcheck="false"></textarea>
<br>
<div>
<span>Method: </span><select onmouseover="tip('Select generation method')" id="namesbaseMethod">
<option value="let-to-let">Markov let-to-let</option>
<option value="let-to-syl">Markov let-to-syl</option>
<option value="syl-to-syl">Markov syl-to-syl</option>
<option value="selection">Random selection</option>
</select><span> Length: </span>
<input id="namesbaseMin" onmouseover="tip('Minimal name length recommendation')" type="number" min="2" max="100" value="4">
<input id="namesbaseMax" onmouseover="tip('Maximal name length recommendation')" type="number" min="2" value="10">
<span>Dublication: </span>
<input id="namesbaseDouble" onmouseover="tip('Populate with letters that can used twice in a row')" autocorrect="off" spellcheck="false" value="abc">
</div>
<fieldset>
<legend>Generated examples: </legend>
<div id="namesbaseExamples" onmouseover="tip('Generated examples. Click to re-gererate')"></div>
</fieldset>
</div>
<div id="namesbaseBottom">
<button id="namesbaseDefault" onmouseover="tip('Restore default namesbase')" class="icon-cancel"></button>
<button id="namesbaseAdd" onmouseover="tip('Add a new base')" class="icon-plus"></button>
<button id="namesbaseUpdateExamples" onmouseover="tip('Re-generate examples based on provided data and generation method')" class="icon-cw"></button>
<button id="namesbaseDownload" onmouseover="tip('Download namesbase to PC')" class="icon-download"></button>
<button id="namesbaseUpload" onmouseover="tip('Upload a namesbase from PC')" class="icon-upload"></button>
<button id="namesbaseMail" onclick="window.open('mailto:maxganiev@yandex.com?Subject=Namesbase%20suggestion', '_blank')" onmouseover="tip('Send a namesbase suggestion to me')" class="icon-mail-alt"></button>
</div>
</div>
<div id="scaleEditor" class="dialog stable" style="display: none"> <div id="scaleEditor" class="dialog stable" style="display: none">
<div id="scaleBody"> <div id="scaleBody">
<div class="scaleHeader"> <div class="scaleHeader">
@ -915,8 +1074,8 @@
</div> </div>
<div> <div>
<div onmouseover="tip('Select how many distance unit are in one pixel')">1 map pixel =</div> <div onmouseover="tip('Select how many distance unit are in one pixel')">1 map pixel =</div>
<input id="distanceScale" onmouseover="tip('Select how many distance unit are in one pixel')" type="range" min="0.1" max="10" value="1" step="0.1"> <input id="distanceScale" onmouseover="tip('Select how many distance unit are in one pixel')" type="range" min="0.1" max="10" value="3" step="0.1">
<input id="scaleOutput" onmouseover="tip('Enter how many distance unit are in one pixel')" type="text" class="output" value="1 mi"> <input id="scaleOutput" onmouseover="tip('Enter how many distance unit are in one pixel')" type="text" class="output" value="3 mi">
</div> </div>
<div> <div>
<div onmouseover="tip('Type area unit name, leave `square` just to add ² to the distance unit selected above')">Area unit: </div> <div onmouseover="tip('Type area unit name, leave `square` just to add ² to the distance unit selected above')">Area unit: </div>
@ -951,8 +1110,8 @@
</div> </div>
<div> <div>
<div>Urbanization rate: </div> <div>Urbanization rate: </div>
<input id="urbanization" onmouseover="tip('Set the ubranization (burgs population relative to all population) rate')" type="range" min="0.02" max="5" value="0.3" step="0.01"> <input id="urbanization" onmouseover="tip('Set the ubranization (burgs population relative to all population) rate')" type="range" min="0.01" max="5" value="1" step="0.01">
<input id="urbanizationOutput" onmouseover="tip('Enter the ubranization (burgs population relative to all population) rate')" type="text" class="output" value="0.3"> <input id="urbanizationOutput" onmouseover="tip('Enter the ubranization (burgs population relative to all population) rate')" type="text" class="output" value="1">
</div> </div>
</div> </div>
<div id="scaleBottom"> <div id="scaleBottom">
@ -965,13 +1124,14 @@
</div> </div>
</div> </div>
<div id="map-dragged" style="display: none">
<p>Drop to upload</p>
</div>
<div id="alert" style="display: none"> <div id="alert" style="display: none">
<p id="alertMessage">Warning!</p> <p id="alertMessage">Warning!</p>
</div> </div>
</div>
<div id="map-dragged" style="display: none">
<p>Drop to upload</p>
</div>
<div id="tooltip" data-main="Сlick the arrow button to open options">Сlick the arrow button to open options</div> <div id="tooltip" data-main="Сlick the arrow button to open options">Сlick the arrow button to open options</div>
@ -980,7 +1140,8 @@
<input type="file" accept=".txt,.csv" id="burgsListToLoad"> <input type="file" accept=".txt,.csv" id="burgsListToLoad">
<input type="file" accept="image/*" id="imageToLoad"> <input type="file" accept="image/*" id="imageToLoad">
<input type="file" accept=".txt" id="templateToLoad"> <input type="file" accept=".txt" id="templateToLoad">
<input type="file" accept=".txt" id="namesbaseToLoad">
</div> </div>
<script src="script.js?version=0.57.00b"></script> <script src="script.js?version=0.59.07b"></script>
</body> </body>

558
libs/jquery-ui.css vendored Normal file
View file

@ -0,0 +1,558 @@
/*! jQuery UI - v1.12.1 - 2018-08-15 http://jqueryui.com
* Includes: draggable.css, core.css, resizable.css, sortable.css, button.css, controlgroup.css, checkboxradio.css, dialog.css, theme.css
* Copyright jQuery Foundation and other contributors; Licensed MIT */
.ui-draggable-handle {
-ms-touch-action: none;
touch-action: none;
}
.ui-helper-hidden {
display: none;
}
.ui-helper-hidden-accessible {
border: 0;
clip: rect(0 0 0 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
}
.ui-helper-reset {
margin: 0;
padding: 0;
border: 0;
outline: 0;
line-height: 1.3;
text-decoration: none;
font-size: 100%;
list-style: none;
}
.ui-helper-clearfix:before,
.ui-helper-clearfix:after {
content: "";
display: table;
border-collapse: collapse;
}
.ui-helper-clearfix:after {
clear: both;
}
.ui-helper-zfix {
width: 100%;
height: 100%;
top: 0;
left: 0;
position: absolute;
opacity: 0;
filter:Alpha(Opacity=0); /* support: IE8 */
}
.ui-front {
z-index: 100;
}
/* Interaction Cues
----------------------------------*/
.ui-state-disabled {
cursor: default !important;
pointer-events: none;
}
/* Icons
----------------------------------*/
.ui-icon {
display: inline-block;
vertical-align: middle;
margin-top: -.25em;
position: relative;
text-indent: -99999px;
overflow: hidden;
background-repeat: no-repeat;
}
.ui-widget-icon-block {
left: 50%;
margin-left: -8px;
display: block;
}
/* Misc visuals
----------------------------------*/
/* Overlays */
.ui-widget-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.ui-resizable {
position: relative;
}
.ui-resizable-handle {
position: absolute;
font-size: 0.1px;
display: block;
-ms-touch-action: none;
touch-action: none;
}
.ui-resizable-disabled .ui-resizable-handle,
.ui-resizable-autohide .ui-resizable-handle {
display: none;
}
.ui-resizable-n {
cursor: n-resize;
height: 7px;
width: 100%;
top: -5px;
left: 0;
}
.ui-resizable-s {
cursor: s-resize;
height: 7px;
width: 100%;
bottom: -5px;
left: 0;
}
.ui-resizable-e {
cursor: e-resize;
width: 7px;
right: -5px;
top: 0;
height: 100%;
}
.ui-resizable-w {
cursor: w-resize;
width: 7px;
left: -5px;
top: 0;
height: 100%;
}
.ui-resizable-se {
cursor: se-resize;
width: 12px;
height: 12px;
right: 1px;
bottom: 1px;
}
.ui-resizable-sw {
cursor: sw-resize;
width: 9px;
height: 9px;
left: -5px;
bottom: -5px;
}
.ui-resizable-nw {
cursor: nw-resize;
width: 9px;
height: 9px;
left: -5px;
top: -5px;
}
.ui-resizable-ne {
cursor: ne-resize;
width: 9px;
height: 9px;
right: -5px;
top: -5px;
}
.ui-sortable-handle {
-ms-touch-action: none;
touch-action: none;
}
.ui-button {
padding: .4em 1em;
display: inline-block;
position: relative;
line-height: normal;
margin-right: .1em;
cursor: pointer;
vertical-align: middle;
text-align: center;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
/* Support: IE <= 11 */
overflow: visible;
}
.ui-button,
.ui-button:link,
.ui-button:visited,
.ui-button:hover,
.ui-button:active {
text-decoration: none;
}
/* to make room for the icon, a width needs to be set here */
.ui-button-icon-only {
width: 2em;
box-sizing: border-box;
white-space: nowrap;
}
/* button icon element(s) */
.ui-button-icon-only .ui-icon {
position: absolute;
top: 50%;
left: 50%;
margin-top: -8px;
margin-left: -8px;
}
.ui-button.ui-icon-notext .ui-icon {
padding: 0;
width: 2.1em;
height: 2.1em;
text-indent: -9999px;
white-space: nowrap;
}
input.ui-button.ui-icon-notext .ui-icon {
width: auto;
height: auto;
text-indent: 0;
white-space: normal;
padding: .4em 1em;
}
/* workarounds */
/* Support: Firefox 5 - 40 */
input.ui-button::-moz-focus-inner,
button.ui-button::-moz-focus-inner {
border: 0;
padding: 0;
}
.ui-controlgroup {
vertical-align: middle;
display: inline-block;
}
.ui-controlgroup > .ui-controlgroup-item {
float: left;
margin-left: 0;
margin-right: 0;
}
.ui-controlgroup > .ui-controlgroup-item:focus,
.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
z-index: 9999;
}
.ui-controlgroup-vertical > .ui-controlgroup-item {
display: block;
float: none;
width: 100%;
margin-top: 0;
margin-bottom: 0;
text-align: left;
}
.ui-controlgroup-vertical .ui-controlgroup-item {
box-sizing: border-box;
}
.ui-controlgroup .ui-controlgroup-label {
padding: .4em 1em;
}
.ui-controlgroup .ui-controlgroup-label span {
font-size: 80%;
}
.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
border-left: none;
}
.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
border-top: none;
}
.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
border-right: none;
}
.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
border-bottom: none;
}
/* Spinner specific style fixes */
.ui-controlgroup-vertical .ui-spinner-input {
/* Support: IE8 only, Android < 4.4 only */
width: 75%;
width: calc( 100% - 2.4em );
}
.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
border-top-style: solid;
}
.ui-checkboxradio-label .ui-icon-background {
box-shadow: inset 1px 1px 1px #ccc;
border-radius: .12em;
border: none;
}
.ui-checkboxradio-radio-label .ui-icon-background {
width: 16px;
height: 16px;
border-radius: 1em;
overflow: visible;
border: none;
}
.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
background-image: none;
width: 8px;
height: 8px;
border-width: 4px;
border-style: solid;
}
.ui-checkboxradio-disabled {
pointer-events: none;
}
body .ui-dialog {
position: absolute;
top: 0;
left: 0;
outline: 0;
padding: 0;
font-size: 12px;
background-color: inherit;
}
.ui-dialog .ui-dialog-titlebar {
padding: .4em 1em;
position: relative;
font-size: 14px;
}
.ui-dialog .ui-dialog-title {
float: left;
margin: .1em 0;
white-space: nowrap;
width: 90%;
overflow: hidden;
text-overflow: ellipsis;
}
.ui-dialog .ui-dialog-titlebar-close {
position: absolute;
right: .5em;
top: 53%;
width: 18px;
margin: -10px 0 0 0;
padding: 0;
height: 18px;
color: #ffffff;
background: none;
font-size: 10px;
}
.ui-dialog .ui-dialog-content {
position: relative;
border: 0;
padding: .5em 1em;
background: none;
overflow: auto;
}
.ui-dialog .ui-dialog-buttonpane {
text-align: left;
border-width: 1px 0 0 0;
background-image: none;
margin-top: .5em;
padding: .3em 1em .5em .4em;
}
.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
float: right;
}
.ui-dialog .ui-dialog-buttonpane button {
margin: .5em .4em .5em 0;
cursor: pointer;
}
.ui-dialog .ui-resizable-n {
height: 2px;
top: 0;
}
.ui-dialog .ui-resizable-e {
width: 2px;
right: 0;
}
.ui-dialog .ui-resizable-s {
height: 2px;
bottom: 0;
}
.ui-dialog .ui-resizable-w {
width: 2px;
left: 0;
}
.ui-dialog .ui-resizable-se,
.ui-dialog .ui-resizable-sw,
.ui-dialog .ui-resizable-ne,
.ui-dialog .ui-resizable-nw {
width: 7px;
height: 7px;
}
.ui-dialog .ui-resizable-se {
right: 0;
bottom: 0;
}
.ui-dialog .ui-resizable-sw {
left: 0;
bottom: 0;
}
.ui-dialog .ui-resizable-ne {
right: 0;
top: 0;
}
.ui-dialog .ui-resizable-nw {
left: 0;
top: 0;
}
.ui-draggable .ui-dialog-titlebar {
cursor: move;
}
/* Component containers
----------------------------------*/
.ui-widget {
font-family: Arial,Helvetica,sans-serif;
}
.ui-widget input,
.ui-widget select,
.ui-widget textarea,
.ui-widget button {
font-family: Arial,Helvetica,sans-serif;
font-size: 1em;
}
.ui-widget.ui-widget-content {
border: 1px solid #5e4fa2;
color: #333333;
}
.ui-widget-content {
border: 1px solid #dddddd;
color: #333333;
}
.ui-widget-content a {
color: #333333;
}
.ui-widget-header {
border-bottom: 1px solid #5d4651;
background: #916e7f;
color: #ffffff;
font-weight: bold;
}
.ui-widget-header a {
color: #333333;
}
/* Interaction states
----------------------------------*/
.ui-state-default,
.ui-widget-content .ui-state-default,
.ui-widget-header .ui-state-default,
.ui-button,
/* We use html here because we need a greater specificity to make sure disabled
works properly when clicked or hovered */
html .ui-button.ui-state-disabled:hover,
html .ui-button.ui-state-disabled:active {
border: 1px solid #c5c5c5;
background: #f6f6f6;
font-weight: normal;
color: #454545;
}
.ui-state-default a,
.ui-state-default a:link,
.ui-state-default a:visited,
a.ui-button,
a:link.ui-button,
a:visited.ui-button,
.ui-button {
color: #454545;
}
.ui-button:active {
color: #5d4651;
border-color: #5d4651;
}
.ui-state-hover a,
.ui-state-hover a:hover,
.ui-state-hover a:link,
.ui-state-hover a:visited,
.ui-state-focus a,
.ui-state-focus a:hover,
.ui-state-focus a:link,
.ui-state-focus a:visited,
a.ui-button:hover,
a.ui-button:focus {
color: #2b2b2b;
text-decoration: none;
}
.ui-visual-focus {
box-shadow: 0 0 3px 1px rgb(94, 158, 214);
}
/* Interaction Cues
----------------------------------*/
.ui-state-highlight,
.ui-widget-content .ui-state-highlight,
.ui-widget-header .ui-state-highlight {
border: 1px solid #dad55e;
background: #fffa90;
color: #777620;
}
.ui-state-checked {
border: 1px solid #dad55e;
background: #fffa90;
}
.ui-state-highlight a,
.ui-widget-content .ui-state-highlight a,
.ui-widget-header .ui-state-highlight a {
color: #777620;
}
.ui-state-error,
.ui-widget-content .ui-state-error,
.ui-widget-header .ui-state-error {
border: 1px solid #f1a899;
background: #fddfdf;
color: #5f3f3f;
}
.ui-state-error a,
.ui-widget-content .ui-state-error a,
.ui-widget-header .ui-state-error a {
color: #5f3f3f;
}
.ui-state-error-text,
.ui-widget-content .ui-state-error-text,
.ui-widget-header .ui-state-error-text {
color: #5f3f3f;
}
.ui-priority-primary,
.ui-widget-content .ui-priority-primary,
.ui-widget-header .ui-priority-primary {
font-weight: bold;
}
.ui-priority-secondary,
.ui-widget-content .ui-priority-secondary,
.ui-widget-header .ui-priority-secondary {
opacity: .7;
filter:Alpha(Opacity=70); /* support: IE8 */
font-weight: normal;
}
.ui-state-disabled,
.ui-widget-content .ui-state-disabled,
.ui-widget-header .ui-state-disabled {
opacity: .35;
filter:Alpha(Opacity=35); /* support: IE8 */
background-image: none;
}
.ui-state-disabled .ui-icon {
filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
}
/* Misc visuals
----------------------------------*/
/* Overlays */
.ui-widget-overlay {
background: #aaaaaa;
opacity: .3;
filter: Alpha(Opacity=30); /* support: IE8 */
}
.ui-widget-shadow {
-webkit-box-shadow: 0px 0px 5px #666666;
box-shadow: 0px 0px 5px #666666;
}

16
libs/jquery-ui.min.js vendored

File diff suppressed because one or more lines are too long

1
libs/seedrandom.min.js vendored Normal file
View file

@ -0,0 +1 @@
!function(a,b){var l,c=eval("this"),d=256,g="random",h=b.pow(d,6),i=b.pow(2,52),j=2*i,k=d-1;function m(r,t,e){var u=[],f=q(function n(r,t){var e,o=[],i=typeof r;if(t&&"object"==i)for(e in r)try{o.push(n(r[e],t-1))}catch(n){}return o.length?o:"string"==i?r:r+"\0"}((t=1==t?{entropy:!0}:t||{}).entropy?[r,s(a)]:null==r?function(){try{var n;return l&&(n=l.randomBytes)?n=n(d):(n=new Uint8Array(d),(c.crypto||c.msCrypto).getRandomValues(n)),s(n)}catch(n){var r=c.navigator,t=r&&r.plugins;return[+new Date,c,t,c.screen,s(a)]}}():r,3),u),p=new n(u),m=function(){for(var n=p.g(6),r=h,t=0;n<i;)n=(n+t)*d,r*=d,t=p.g(1);for(;j<=n;)n/=2,r/=2,t>>>=1;return(n+t)/r};return m.int32=function(){return 0|p.g(4)},m.quick=function(){return p.g(4)/4294967296},m.double=m,q(s(p.S),a),(t.pass||e||function(n,r,t,e){return e&&(e.S&&o(e,p),n.state=function(){return o(p,{})}),t?(b[g]=n,r):n})(m,f,"global"in t?t.global:this==b,t.state)}function n(n){var r,t=n.length,u=this,e=0,o=u.i=u.j=0,i=u.S=[];for(t||(n=[t++]);e<d;)i[e]=e++;for(e=0;e<d;e++)i[e]=i[o=k&o+n[e%t]+(r=i[e])],i[o]=r;(u.g=function(n){for(var r,t=0,e=u.i,o=u.j,i=u.S;n--;)r=i[e=k&e+1],t=t*d+i[k&(i[e]=i[o=k&o+r])+(i[o]=r)];return u.i=e,u.j=o,t})(d)}function o(n,r){return r.i=n.i,r.j=n.j,r.S=n.S.slice(),r}function q(n,r){for(var t,e=n+"",o=0;o<e.length;)r[k&o]=k&(t^=19*r[k&o])+e.charCodeAt(o++);return s(r)}function s(n){return String.fromCharCode.apply(0,n)}if(b["seed"+g]=m,q(b.random(),a),"object"==typeof module&&module.exports){module.exports=m;try{l=require("crypto")}catch(n){}}else"function"==typeof define&&define.amd&&define(function(){return m})}([],Math);

View file

@ -1,10 +0,0 @@
var cultures = ["Shwazen","Angshire","Luari","Latian","Toledi","Slovian","Varangian"];
var manorNames = [
["Achern","Aichhalden","Aitern","Albbruck","Alpirsbach","Altensteig","Althengstett","Appenweier","Auggen","Wildbad","Badenen","Badenweiler","Baiersbronn","Ballrechten","Bellingen","Berghaupten","Bernau","Biberach","Biederbach","Binzen","Birkendorf","Birkenfeld","Bischweier","Blumberg","Bollen","Bollschweil","Bonndorf","Bosingen","Braunlingen","Breisach","Breisgau","Breitnau","Brigachtal","Buchenbach","Buggingen","Buhl","Buhlertal","Calw","Dachsberg","Dobel","Donaueschingen","Dornhan","Dornstetten","Dottingen","Dunningen","Durbach","Durrheim","Ebhausen","Ebringen","Efringen","Egenhausen","Ehrenkirchen","Ehrsberg","Eimeldingen","Eisenbach","Elzach","Elztal","Emmendingen","Endingen","Engelsbrand","Enz","Enzklosterle","Eschbronn","Ettenheim","Ettlingen","Feldberg","Fischerbach","Fischingen","Fluorn","Forbach","Freiamt","Freiburg","Freudenstadt","Friedenweiler","Friesenheim","Frohnd","Furtwangen","Gaggenau","Geisingen","Gengenbach","Gernsbach","Glatt","Glatten","Glottertal","Gorwihl","Gottenheim","Grafenhausen","Grenzach","Griesbach","Gutach","Gutenbach","Hag","Haiterbach","Hardt","Harmersbach","Hasel","Haslach","Hausach","Hausen","Hausern","Heitersheim","Herbolzheim","Herrenalb","Herrischried","Hinterzarten","Hochenschwand","Hofen","Hofstetten","Hohberg","Horb","Horben","Hornberg","Hufingen","Ibach","Ihringen","Inzlingen","Kandern","Kappel","Kappelrodeck","Karlsbad","Karlsruhe","Kehl","Keltern","Kippenheim","Kirchzarten","Konigsfeld","Krozingen","Kuppenheim","Kussaberg","Lahr","Lauchringen","Lauf","Laufenburg","Lautenbach","Lauterbach","Lenzkirch","Liebenzell","Loffenau","Loffingen","Lorrach","Lossburg","Mahlberg","Malsburg","Malsch","March","Marxzell","Marzell","Maulburg","Monchweiler","Muhlenbach","Mullheim","Munstertal","Murg","Nagold","Neubulach","Neuenburg","Neuhausen","Neuried","Neuweiler","Niedereschach","Nordrach","Oberharmersbach","Oberkirch","Oberndorf","Oberbach","Oberried","Oberwolfach","Offenburg","Ohlsbach","Oppenau","Ortenberg","otigheim","Ottenhofen","Ottersweier","Peterstal","Pfaffenweiler","Pfalzgrafenweiler","Pforzheim","Rastatt","Renchen","Rheinau","Rheinfelden","Rheinmunster","Rickenbach","Rippoldsau","Rohrdorf","Rottweil","Rummingen","Rust","Sackingen","Sasbach","Sasbachwalden","Schallbach","Schallstadt","Schapbach","Schenkenzell","Schiltach","Schliengen","Schluchsee","Schomberg","Schonach","Schonau","Schonenberg","Schonwald","Schopfheim","Schopfloch","Schramberg","Schuttertal","Schwenningen","Schworstadt","Seebach","Seelbach","Seewald","Sexau","Simmersfeld","Simonswald","Sinzheim","Solden","Staufen","Stegen","Steinach","Steinen","Steinmauern","Straubenhardt","Stuhlingen","Sulz","Sulzburg","Teinach","Tiefenbronn","Tiengen","Titisee","Todtmoos","Todtnau","Todtnauberg","Triberg","Tunau","Tuningen","uhlingen","Unterkirnach","Reichenbach","Utzenfeld","Villingen","Villingendorf","Vogtsburg","Vohrenbach","Waldachtal","Waldbronn","Waldkirch","Waldshut","Wehr","Weil","Weilheim","Weisenbach","Wembach","Wieden","Wiesental","Wildberg","Winzeln","Wittlingen","Wittnau","Wolfach","Wutach","Wutoschingen","Wyhlen","Zavelstein"],
["Abingdon","Albrighton","Alcester","Almondbury","Altrincham","Amersham","Andover","Appleby","Ashboume","Atherstone","Aveton","Axbridge","Aylesbury","Baldock","Bamburgh","Barton","Basingstoke","Berden","Bere","Berkeley","Berwick","Betley","Bideford","Bingley","Birmingham","Blandford","Blechingley","Bodmin","Bolton","Bootham","Boroughbridge","Boscastle","Bossinney","Bramber","Brampton","Brasted","Bretford","Bridgetown","Bridlington","Bromyard","Bruton","Buckingham","Bungay","Burton","Calne","Cambridge","Canterbury","Carlisle","Castleton","Caus","Charmouth","Chawleigh","Chichester","Chillington","Chinnor","Chipping","Chisbury","Cleobury","Clifford","Clifton","Clitheroe","Cockermouth","Coleshill","Combe","Congleton","Crafthole","Crediton","Cuddenbeck","Dalton","Darlington","Dodbrooke","Drax","Dudley","Dunstable","Dunster","Dunwich","Durham","Dymock","Exeter","Exning","Faringdon","Felton","Fenny","Finedon","Flookburgh","Fowey","Frampton","Gateshead","Gatton","Godmanchester","Grampound","Grantham","Guildford","Halesowen","Halton","Harbottle","Harlow","Hatfield","Hatherleigh","Haydon","Helston","Henley","Hertford","Heytesbury","Hinckley","Hitchin","Holme","Hornby","Horsham","Kendal","Kenilworth","Kilkhampton","Kineton","Kington","Kinver","Kirby","Knaresborough","Knutsford","Launceston","Leighton","Lewes","Linton","Louth","Luton","Lyme","Lympstone","Macclesfield","Madeley","Malborough","Maldon","Manchester","Manningtree","Marazion","Marlborough","Marshfield","Mere","Merryfield","Middlewich","Midhurst","Milborne","Mitford","Modbury","Montacute","Mousehole","Newbiggin","Newborough","Newbury","Newenden","Newent","Norham","Northleach","Noss","Oakham","Olney","Orford","Ormskirk","Oswestry","Padstow","Paignton","Penkneth","Penrith","Penzance","Pershore","Petersfield","Pevensey","Pickering","Pilton","Pontefract","Portsmouth","Preston","Quatford","Reading","Redcliff","Retford","Rockingham","Romney","Rothbury","Rothwell","Salisbury","Saltash","Seaford","Seasalter","Sherston","Shifnal","Shoreham","Sidmouth","Skipsea","Skipton","Solihull","Somerton","Southam","Southwark","Standon","Stansted","Stapleton","Stottesdon","Sudbury","Swavesey","Tamerton","Tarporley","Tetbury","Thatcham","Thaxted","Thetford","Thornbury","Tintagel","Tiverton","Torksey","Totnes","Towcester","Tregoney","Trematon","Tutbury","Uxbridge","Wallingford","Wareham","Warenmouth","Wargrave","Warton","Watchet","Watford","Wendover","Westbury","Westcheap","Weymouth","Whitford","Wickwar","Wigan","Wigmore","Winchelsea","Winkleigh","Wiscombe","Witham","Witheridge","Wiveliscombe","Woodbury","Yeovil"],
["Adon","Aillant","Amilly","Andonville","Ardon","Artenay","Ascheres","Ascoux","Attray","Aubin","Audeville","Aulnay","Autruy","Auvilliers","Auxy","Aveyron","Baccon","Bardon","Barville","Batilly","Baule","Bazoches","Beauchamps","Beaugency","Beaulieu","Beaune","Bellegarde","Boesses","Boigny","Boiscommun","Boismorand","Boisseaux","Bondaroy","Bonnee","Bonny","Bordes","Bou","Bougy","Bouilly","Boulay","Bouzonville","Bouzy","Boynes","Bray","Breteau","Briare","Briarres","Bricy","Bromeilles","Bucy","Cepoy","Cercottes","Cerdon","Cernoy","Cesarville","Chailly","Chaingy","Chalette","Chambon","Champoulet","Chanteau","Chantecoq","Chapell","Charme","Charmont","Charsonville","Chateau","Chateauneuf","Chatel","Chatenoy","Chatillon","Chaussy","Checy","Chevannes","Chevillon","Chevilly","Chevry","Chilleurs","Choux","Chuelles","Clery","Coinces","Coligny","Combleux","Combreux","Conflans","Corbeilles","Corquilleroy","Cortrat","Coudroy","Coullons","Coulmiers","Courcelles","Courcy","Courtemaux","Courtempierre","Courtenay","Cravant","Crottes","Dadonville","Dammarie","Dampierre","Darvoy","Desmonts","Dimancheville","Donnery","Dordives","Dossainville","Douchy","Dry","Echilleuses","Egry","Engenville","Epieds","Erceville","Ervauville","Escrennes","Escrignelles","Estouy","Faverelles","Fay","Feins","Ferolles","Ferrieres","Fleury","Fontenay","Foret","Foucherolles","Freville","Gatinais","Gaubertin","Gemigny","Germigny","Gidy","Gien","Girolles","Givraines","Gondreville","Grangermont","Greneville","Griselles","Guigneville","Guilly","Gyleslonains","Huetre","Huisseau","Ingrannes","Ingre","Intville","Isdes","Jargeau","Jouy","Juranville","Bussiere","Laas","Ladon","Lailly","Langesse","Leouville","Ligny","Lombreuil","Lorcy","Lorris","Loury","Louzouer","Malesherbois","Marcilly","Mardie","Mareau","Marigny","Marsainvilliers","Melleroy","Menestreau","Merinville","Messas","Meung","Mezieres","Migneres","Mignerette","Mirabeau","Montargis","Montbarrois","Montbouy","Montcresson","Montereau","Montigny","Montliard","Mormant","Morville","Moulinet","Moulon","Nancray","Nargis","Nesploy","Neuville","Neuvy","Nevoy","Nibelle","Nogent","Noyers","Ocre","Oison","Olivet","Ondreville","Onzerain","Orleans","Ormes","Orville","Oussoy","Outarville","Ouzouer","Pannecieres","Pannes","Patay","Paucourt","Pers","Pierrefitte","Pithiverais","Pithiviers","Poilly","Potier","Prefontaines","Presnoy","Pressigny","Puiseaux","Quiers","Ramoulu","Rebrechien","Rouvray","Rozieres","Rozoy","Ruan","Sandillon","Santeau","Saran","Sceaux","Seichebrieres","Semoy","Sennely","Sermaises","Sigloy","Solterre","Sougy","Sully","Sury","Tavers","Thignonville","Thimory","Thorailles","Thou","Tigy","Tivernon","Tournoisis","Trainou","Treilles","Trigueres","Trinay","Vannes","Varennes","Vennecy","Vieilles","Vienne","Viglain","Vignes","Villamblain","Villemandeur","Villemoutiers","Villemurlin","Villeneuve","Villereau","Villevoques","Villorceau","Vimory","Vitry","Vrigny","Ivre"],
["Accumoli","Acquafondata","Acquapendente","Acuto","Affile","Agosta","Alatri","Albano","Allumiere","Alvito","Amaseno","Amatrice","Anagni","Anguillara","Anticoli","Antrodoco","Anzio","Aprilia","Aquino","Arce","Arcinazzo","Ardea","Ariccia","Arlena","Arnara","Arpino","Arsoli","Artena","Ascrea","Atina","Ausonia","Bagnoregio","Barbarano","Bassano","Bassiano","Bellegra","Belmonte","Blera","Bolsena","Bomarzo","Borbona","Borgo","Borgorose","Boville","Bracciano","Broccostella","Calcata","Camerata","Campagnano","Campodimele","Campoli","Canale","Canepina","Canino","Cantalice","Cantalupo","Canterano","Capena","Capodimonte","Capranica","Caprarola","Carbognano","Casalattico","Casalvieri","Casape","Casaprota","Casperia","Cassino","Castelforte","Castelliri","Castello","Castelnuovo","Castiglione","Castro","Castrocielo","Cave","Ceccano","Celleno","Cellere","Ceprano","Cerreto","Cervara","Cervaro","Cerveteri","Ciampino","Ciciliano","Cineto","Cisterna","Cittaducale","Cittareale","Civita","Civitavecchia","Civitella","Colfelice","Collalto","Colle","Colleferro","Collegiove","Collepardo","Collevecchio","Colli","Colonna","Concerviano","Configni","Contigliano","Corchiano","Coreno","Cori","Cottanello","Esperia","Fabrica","Faleria","Falvaterra","Fara","Farnese","Ferentino","Fiamignano","Fiano","Filacciano","Filettino","Fiuggi","Fiumicino","Fondi","Fontana","Fonte","Fontechiari","Forano","Formello","Formia","Frascati","Frasso","Frosinone","Fumone","Gaeta","Gallese","Gallicano","Gallinaro","Gavignano","Genazzano","Genzano","Gerano","Giuliano","Gorga","Gradoli","Graffignano","Greccio","Grottaferrata","Grotte","Guarcino","Guidonia","Ischia","Isola","Itri","Jenne","Labico","Labro","Ladispoli","Lanuvio","Lariano","Latera","Lenola","Leonessa","Licenza","Longone","Lubriano","Maenza","Magliano","Mandela","Manziana","Marano","Marcellina","Marcetelli","Marino","Marta","Mazzano","Mentana","Micigliano","Minturno","Mompeo","Montalto","Montasola","Monte","Montebuono","Montefiascone","Monteflavio","Montelanico","Monteleone","Montelibretti","Montenero","Monterosi","Monterotondo","Montopoli","Montorio","Moricone","Morlupo","Morolo","Morro","Nazzano","Nemi","Nepi","Nerola","Nespolo","Nettuno","Norma","Olevano","Onano","Oriolo","Orte","Orvinio","Paganico","Palestrina","Paliano","Palombara","Pastena","Patrica","Percile","Pescorocchiano","Pescosolido","Petrella","Piansano","Picinisco","Pico","Piedimonte","Piglio","Pignataro","Pisoniano","Pofi","Poggio","Poli","Pomezia","Pontecorvo","Pontinia","Ponza","Ponzano","Posta","Pozzaglia","Priverno","Proceno","Prossedi","Riano","Rieti","Rignano","Riofreddo","Ripi","Rivodutri","Rocca","Roccagiovine","Roccagorga","Roccantica","Roccasecca","Roiate","Ronciglione","Roviano","Sabaudia","Sacrofano","Salisano","Sambuci","Santa","Santi","Santopadre","Saracinesco","Scandriglia","Segni","Selci","Sermoneta","Serrone","Settefrati","Sezze","Sgurgola","Sonnino","Sora","Soriano","Sperlonga","Spigno","Stimigliano","Strangolagalli","Subiaco","Supino","Sutri","Tarano","Tarquinia","Terelle","Terracina","Tessennano","Tivoli","Toffia","Tolfa","Torre","Torri","Torrice","Torricella","Torrita","Trevi","Trevignano","Trivigliano","Turania","Tuscania","Vacone","Valentano","Vallecorsa","Vallemaio","Vallepietra","Vallerano","Vallerotonda","Vallinfreda","Valmontone","Varco","Vasanello","Vejano","Velletri","Ventotene","Veroli","Vetralla","Vicalvi","Vico","Vicovaro","Vignanello","Viterbo","Viticuso","Vitorchiano","Vivaro","Zagarolo"],
["Abanades","Ablanque","Adobes","Ajofrin","Alameda","Alaminos","Alarilla","Albalate","Albares","Albarreal","Albendiego","Alcabon","Alcanizo","Alcaudete","Alcocer","Alcolea","Alcoroches","Aldea","Aldeanueva","Algar","Algora","Alhondiga","Alique","Almadrones","Almendral","Almoguera","Almonacid","Almorox","Alocen","Alovera","Alustante","Angon","Anguita","Anover","Anquela","Arbancon","Arbeteta","Arcicollar","Argecilla","Arges","Armallones","Armuna","Arroyo","Atanzon","Atienza","Aunon","Azuqueca","Azutan","Baides","Banos","Banuelos","Barcience","Bargas","Barriopedro","Belvis","Berninches","Borox","Brihuega","Budia","Buenaventura","Bujalaro","Burguillos","Burujon","Bustares","Cabanas","Cabanillas","Calera","Caleruela","Calzada","Camarena","Campillo","Camunas","Canizar","Canredondo","Cantalojas","Cardiel","Carmena","Carranque","Carriches","Casa","Casarrubios","Casas","Casasbuenas","Caspuenas","Castejon","Castellar","Castilforte","Castillo","Castilnuevo","Cazalegas","Cebolla","Cedillo","Cendejas","Centenera","Cervera","Checa","Chequilla","Chillaron","Chiloeches","Chozas","Chueca","Cifuentes","Cincovillas","Ciruelas","Ciruelos","Cobeja","Cobeta","Cobisa","Cogollor","Cogolludo","Condemios","Congostrina","Consuegra","Copernal","Corduente","Corral","Cuerva","Domingo","Dosbarrios","Driebes","Duron","El","Embid","Erustes","Escalona","Escalonilla","Escamilla","Escariche","Escopete","Espinosa","Espinoso","Esplegares","Esquivias","Estables","Estriegana","Fontanar","Fuembellida","Fuensalida","Fuentelsaz","Gajanejos","Galve","Galvez","Garciotum","Gascuena","Gerindote","Guadamur","Henche","Heras","Herreria","Herreruela","Hijes","Hinojosa","Hita","Hombrados","Hontanar","Hontoba","Horche","Hormigos","Huecas","Huermeces","Huerta","Hueva","Humanes","Illan","Illana","Illescas","Iniestola","Irueste","Jadraque","Jirueque","Lagartera","Las","Layos","Ledanca","Lillo","Lominchar","Loranca","Los","Lucillos","Lupiana","Luzaga","Luzon","Madridejos","Magan","Majaelrayo","Malaga","Malaguilla","Malpica","Mandayona","Mantiel","Manzaneque","Maqueda","Maranchon","Marchamalo","Marjaliza","Marrupe","Mascaraque","Masegoso","Matarrubia","Matillas","Mazarete","Mazuecos","Medranda","Megina","Mejorada","Mentrida","Mesegar","Miedes","Miguel","Millana","Milmarcos","Mirabueno","Miralrio","Mocejon","Mochales","Mohedas","Molina","Monasterio","Mondejar","Montarron","Mora","Moratilla","Morenilla","Muduex","Nambroca","Navalcan","Negredo","Noblejas","Noez","Nombela","Noves","Numancia","Nuno","Ocana","Ocentejo","Olias","Olmeda","Ontigola","Orea","Orgaz","Oropesa","Otero","Palmaces","Palomeque","Pantoja","Pardos","Paredes","Pareja","Parrillas","Pastrana","Pelahustan","Penalen","Penalver","Pepino","Peralejos","Peralveche","Pinilla","Pioz","Piqueras","Polan","Portillo","Poveda","Pozo","Pradena","Prados","Puebla","Puerto","Pulgar","Quer","Quero","Quintanar","Quismondo","Rebollosa","Recas","Renera","Retamoso","Retiendas","Riba","Rielves","Rillo","Riofrio","Robledillo","Robledo","Romanillos","Romanones","Rueda","Sacecorbo","Sacedon","Saelices","Salmeron","San","Santa","Santiuste","Santo","Sartajada","Sauca","Sayaton","Segurilla","Selas","Semillas","Sesena","Setiles","Sevilleja","Sienes","Siguenza","Solanillos","Somolinos","Sonseca","Sotillo","Sotodosos","Talavera","Tamajon","Taragudo","Taravilla","Tartanedo","Tembleque","Tendilla","Terzaga","Tierzo","Tordellego","Tordelrabano","Tordesilos","Torija","Torralba","Torre","Torrecilla","Torrecuadrada","Torrejon","Torremocha","Torrico","Torrijos","Torrubia","Tortola","Tortuera","Tortuero","Totanes","Traid","Trijueque","Trillo","Turleque","Uceda","Ugena","Ujados","Urda","Utande","Valdarachas","Valdesotos","Valhermoso","Valtablado","Valverde","Velada","Viana","Vinuelas","Yebes","Yebra","Yelamos","Yeles","Yepes","Yuncler","Yunclillos","Yuncos","Yunquera","Zaorejas","Zarzuela","Zorita"],
["Belgorod","Beloberezhye","Belyi","Belz","Berestei","Berezhets","Berezovech","Berezutsk","Bobruisk","Bolonets","Borisov","Borovsk","Bozhesk","Bratslav","Bryansk","Brynsk","Buryn","Byhov","Chechersk","Chemesov","Cheremosh","Cherlen","Chern","Chernigov","Chernitsa","Chernobyl","Chernogorod","Chertoryesk","Chetvertnia","Demyansk","Derevesk","Devyagoresk","Dichin","Dmitrov","Dorogobuch","Dorogobuzh","Drestvin","Drokov","Drutsk","Dubechin","Dubichi","Dubki","Dubkov","Dveren","Galich","Glebovo","Glinsk","Goloty","Gomiy","Gorodets","Gorodische","Gorodno","Gorohovets","Goroshin","Gorval","Goryshon","Holm","Horobor","Hoten","Hotin","Hotmyzhsk","Ilovech","Ivan","Izborsk","Izheslavl","Kamenets","Kanev","Karachev","Karna","Kavarna","Klechesk","Klyapech","Kolomyya","Kolyvan","Kopyl","Korec","Kornik","Korochunov","Korshev","Korsun","Koshkin","Kotelno","Kovyla","Kozelsk","Kozelsk","Kremenets","Krichev","Krylatsk","Ksniatin","Kulatsk","Kursk","Kursk","Lebedev","Lida","Logosko","Lomihvost","Loshesk","Loshichi","Lubech","Lubno","Lubutsk","Lutsk","Luchin","Luki","Lukoml","Luzha","Lvov","Mtsensk","Mdin","Medniki","Melecha","Merech","Meretsk","Mescherskoe","Meshkovsk","Metlitsk","Mezetsk","Mglin","Mihailov","Mikitin","Mikulino","Miloslavichi","Mogilev","Mologa","Moreva","Mosalsk","Moschiny","Mozyr","Mstislav","Mstislavets","Muravin","Nemech","Nemiza","Nerinsk","Nichan","Novgorod","Novogorodok","Obolichi","Obolensk","Obolensk","Oleshsk","Olgov","Omelnik","Opoka","Opoki","Oreshek","Orlets","Osechen","Oster","Ostrog","Ostrov","Perelai","Peremil","Peremyshl","Pererov","Peresechen","Perevitsk","Pereyaslav","Pinsk","Ples","Polotsk","Pronsk","Proposhesk","Punia","Putivl","Rechitsa","Rodno","Rogachev","Romanov","Romny","Roslavl","Rostislavl","Rostovets","Rsha","Ruza","Rybchesk","Rylsk","Rzhavesk","Rzhev","Rzhischev","Sambor","Serensk","Serensk","Serpeysk","Shilov","Shuya","Sinech","Sizhka","Skala","Slovensk","Slutsk","Smedin","Sneporod","Snitin","Snovsk","Sochevo","Sokolec","Starica","Starodub","Stepan","Sterzh","Streshin","Sutesk","Svinetsk","Svisloch","Terebovl","Ternov","Teshilov","Teterin","Tiversk","Torchevsk","Toropets","Torzhok","Tripolye","Trubchevsk","Tur","Turov","Usvyaty","Uteshkov","Vasilkov","Velil","Velye","Venev","Venicha","Verderev","Vereya","Veveresk","Viazma","Vidbesk","Vidychev","Voino","Volodimer","Volok","Volyn","Vorobesk","Voronich","Voronok","Vorotynsk","Vrev","Vruchiy","Vselug","Vyatichsk","Vyatka","Vyshegorod","Vyshgorod","Vysokoe","Yagniatin","Yaropolch","Yasenets","Yuryev","Yuryevets","Zaraysk","Zhitomel","Zholvazh","Zizhech","Zubkov","Zudechev","Zvenigorod"],
["Akureyri","Aldra","Alftanes","Andenes","Austbo","Auvog","Bakkafjordur","Ballangen","Bardal","Beisfjord","Bifrost","Bildudalur","Bjerka","Bjerkvik","Bjorkosen","Bliksvaer","Blokken","Blonduos","Bolga","Bolungarvik","Borg","Borgarnes","Bosmoen","Bostad","Bostrand","Botsvika","Brautarholt","Breiddalsvik","Bringsli","Brunahlid","Budardalur","Byggdakjarni","Dalvik","Djupivogur","Donnes","Drageid","Drangsnes","Egilsstadir","Eiteroga","Elvenes","Engavogen","Ertenvog","Eskifjordur","Evenes","Eyrarbakki","Fagernes","Fallmoen","Fellabaer","Fenes","Finnoya","Fjaer","Fjelldal","Flakstad","Flateyri","Flostrand","Fludir","Gardabær","Gardur","Gimstad","Givaer","Gjeroy","Gladstad","Godoya","Godoynes","Granmoen","Gravdal","Grenivik","Grimsey","Grindavik","Grytting","Hafnir","Halsa","Hauganes","Haugland","Hauknes","Hella","Helland","Hellissandur","Hestad","Higrav","Hnifsdalur","Hofn","Hofsos","Holand","Holar","Holen","Holkestad","Holmavik","Hopen","Hovden","Hrafnagil","Hrisey","Husavik","Husvik","Hvammstangi","Hvanneyri","Hveragerdi","Hvolsvollur","Igeroy","Indre","Inndyr","Innhavet","Innnes","Isafjordur","Jarklaustur","Jarnsreykir","Junkerdal","Kaldvog","Kanstad","Karlsoy","Kavosen","Keflavik","Kjelde","Kjerstad","Klakk","Kopasker","Kopavogur","Korgen","Kristnes","Krutoga","Krystad","Kvina","Lande","Laugar","Laugaras","Laugarbakki","Laugarvatn","Laupstad","Leines","Leira","Leiren","Leland","Lenvika","Loding","Lodingen","Lonsbakki","Lopsmarka","Lovund","Luroy","Maela","Melahverfi","Meloy","Mevik","Misvaer","Mornes","Mosfellsbær","Moskenes","Myken","Naurstad","Nesberg","Nesjahverfi","Nesset","Nevernes","Obygda","Ofoten","Ogskardet","Okervika","Oknes","Olafsfjordur","Oldervika","Olstad","Onstad","Oppeid","Oresvika","Orsnes","Orsvog","Osmyra","Overdal","Prestoya","Raudalaekur","Raufarhofn","Reipo","Reykholar","Reykholt","Reykjahlid","Rif","Rinoya","Rodoy","Rognan","Rosvika","Rovika","Salhus","Sanden","Sandgerdi","Sandoker","Sandset","Sandvika","Saudarkrokur","Selfoss","Selsoya","Sennesvik","Setso","Siglufjordur","Silvalen","Skagastrond","Skjerstad","Skonland","Skorvogen","Skrova","Sleneset","Snubba","Softing","Solheim","Solheimar","Sorarnoy","Sorfugloy","Sorland","Sormela","Sorvaer","Sovika","Stamsund","Stamsvika","Stave","Stokka","Stokkseyri","Storjord","Storo","Storvika","Strand","Straumen","Strendene","Sudavik","Sudureyri","Sundoya","Sydalen","Thingeyri","Thorlakshofn","Thorshofn","Tjarnabyggd","Tjotta","Tosbotn","Traelnes","Trofors","Trones","Tverro","Ulvsvog","Unnstad","Utskor","Valla","Vandved","Varmahlid","Vassos","Vevelstad","Vidrek","Vik","Vikholmen","Vogar","Vogehamn","Vopnafjordur"]
];

5048
script.js

File diff suppressed because one or more lines are too long