From 60057c52ed3cfc2533b8b814d8ca78e6fa5effdd Mon Sep 17 00:00:00 2001 From: Azgaar Date: Sat, 25 Sep 2021 21:49:34 +0300 Subject: [PATCH] markers - generate from config file --- index.css | 25 ++++ index.html | 4 +- main.js | 1 + modules/load.js | 5 + modules/markers-generator.js | 269 +++++++++++++++++++---------------- modules/ui/tools.js | 35 ++--- 6 files changed, 192 insertions(+), 147 deletions(-) diff --git a/index.css b/index.css index 6e94057c..4d6f7f15 100644 --- a/index.css +++ b/index.css @@ -428,6 +428,31 @@ button.options:hover { cursor: pointer; } +#options button i.icon-cog { + position: absolute; + padding: 0.1em 0.3em; + background-color: var(--bg-lighter); + border-radius: 50%; + visibility: hidden; + opacity: 0; + transition: 0.4s ease-in-out; +} + +#options button i.icon-cog:hover { + color: #111; + background-color: var(--bg-light); + transform: rotateZ(180deg); +} + +#options button i.icon-cog:active { + transform: translateY(1px); +} + +#options button:hover i.icon-cog { + visibility: visible; + opacity: 1; +} + input[type="color"] { -webkit-appearance: none; cursor: pointer; diff --git a/index.html b/index.html index df8ab608..0843ab81 100644 --- a/index.html +++ b/index.html @@ -227,7 +227,7 @@
Azgaar's
Fantasy Map Generator
-
v. 1.66
+
v. 1.7

LOADING...

@@ -1362,7 +1362,7 @@ - + diff --git a/main.js b/main.js index 1c5a1313..822260a3 100644 --- a/main.js +++ b/main.js @@ -2,6 +2,7 @@ // https://github.com/Azgaar/Fantasy-Map-Generator "use strict"; +// TODO: pump version to 1.7 const version = "1.662"; // generator version document.title += " v" + version; diff --git a/modules/load.js b/modules/load.js index c46b413c..98ce0b44 100644 --- a/modules/load.js +++ b/modules/load.js @@ -868,6 +868,11 @@ function parseLoadedData(data) { rivers.attr("style", null); borders.attr("style", null); } + + if (version < 1.7) { + // v 1.7 changed markers data + // TODO: get markers data from svg + } })(); void (function checkDataIntegrity() { diff --git a/modules/markers-generator.js b/modules/markers-generator.js index b6810779..4f2376d1 100644 --- a/modules/markers-generator.js +++ b/modules/markers-generator.js @@ -1,62 +1,86 @@ "use strict"; window.Markers = (function () { - let multiplier = 1; + let config = []; + + function getDefaultConfig() { + const culturesSet = document.getElementById("culturesSet").value; + const isFantasy = culturesSet.includes("Fantasy"); + + return [ + {type: "volcanoes", icon: "🌋", multiplier: 1, fn: addVolcanoes}, + {type: "hot-springs", icon: "♨️", multiplier: 1, fn: addHotSprings}, + {type: "mines", icon: "⛏️", multiplier: 1, fn: addMines}, + {type: "bridges", icon: "🌉", multiplier: 1, fn: addBridges}, + {type: "inns", icon: "🍻", multiplier: 1, fn: addInns}, + {type: "lighthouses", icon: "🚨", multiplier: 1, fn: addLighthouses}, + {type: "waterfalls", icon: "⟱", multiplier: 1, fn: addWaterfalls}, + {type: "battlefields", icon: "⚔️", multiplier: 1, fn: addBattlefields}, + {type: "dungeons", icon: "🗝️", multiplier: 1, fn: addDungeons}, + {type: "lake-monsters", icon: "🐉", multiplier: 1, fn: addLakeMonsters}, + {type: "sea-monsters", icon: "🦑", multiplier: 1, fn: addSeaMonsters}, + {type: "hill-monsters", icon: "👹", multiplier: 1, fn: addHillMonsters}, + {type: "sacred-mountains", icon: "🗻", multiplier: 1, fn: addSacredMountains}, + {type: "sacred-forests", icon: "🌳", multiplier: 1, fn: addSacredForests}, + {type: "sacred-pineries", icon: "🌲", multiplier: 1, fn: addSacredPineries}, + {type: "sacred-palm-groves", icon: "🌴", multiplier: 1, fn: addSacredPalmGroves}, + {type: "brigands", icon: "💰", multiplier: 1, fn: addBrigands}, + {type: "pirates", icon: "🏴‍☠️", multiplier: 1, fn: addPirates}, + {type: "statues", icon: "🗿", multiplier: 1, fn: addStatues}, + {type: "ruines", icon: "🏺", multiplier: 1, fn: addRuines}, + {type: "portals", icon: "🌀", multiplier: isFantasy, fn: addPortals} + ]; + } + + const getConfig = () => config; + + const setConfig = newConfig => { + config = newConfig; + }; const generate = function () { + setConfig(getDefaultConfig()); pack.markers = []; generateTypes(); }; - const regenerate = requestedMultiplier => { - if (requestedMultiplier === 0) return; - if (requestedMultiplier) multiplier = requestedMultiplier; + const regenerate = () => { + pack.markers = pack.markers.filter(({i, lock}) => { + if (lock) return true; + + const id = `marker${i}`; + document.getElementById(id)?.remove(); + const index = notes.findIndex(note => note.id === id); + if (index != -1) notes.splice(index, 1); + return false; + }); + generateTypes(); }; - const generateTypes = () => { + function generateTypes() { TIME && console.time("addMarkers"); - - const culturesSet = document.getElementById("culturesSet").value; // TODO: don't put multiple markers to the same cell - addVolcanoes(); - addHotSprings(); - addMines(); - addBridges(); - addInns(); - addLighthouses(); - addWaterfalls(); - addBattlefields(); - addDungeons(); - addLakeMonsters(); - addSeaMonsters(); - addHillMonsters(); - addSacredMountains(); - addSacredForests(); - addSacredPineries(); - addSacredPalmGroves(); - addBrigands(); - addPirates(); - addStatues(); - addRuines(); - if (culturesSet.includes("Fantasy")) addPortals(); - + config.forEach(({type, icon, multiplier, fn}) => { + if (multiplier === 0) return; + fn(type, icon, multiplier); + }); TIME && console.timeEnd("addMarkers"); - }; + } - const getQuantity = (array, min, each) => { + function getQuantity(array, min, each, multiplier) { if (!array.length || array.length < min / multiplier) return 0; const requestQty = Math.ceil((array.length / each) * multiplier); return array.length < requestQty ? array.length : requestQty; - }; + } - const extractAnyElement = array => { + function extractAnyElement(array) { const index = Math.floor(Math.random() * array.length); return array.splice(index, 1); - }; + } - const getMarkerCoordinates = cell => { + function getMarkerCoordinates(cell) { const {cells, burgs} = pack; const burgId = cells.burg[cell]; @@ -66,19 +90,30 @@ window.Markers = (function () { } return cells.p[cell]; - }; + } - function addVolcanoes() { + function addMarker({cell, type, icon, dx, dy, px}) { + const i = pack.markers.length; + const [x, y] = getMarkerCoordinates(cell); + const marker = {i, icon, type, x, y}; + if (dx) marker.dx = dx; + if (dy) marker.dy = dy; + if (px) marker.px = px; + pack.markers.push(marker); + return "marker" + i; + } + + function addVolcanoes(type, icon, multiplier) { const {cells} = pack; let mountains = Array.from(cells.i.filter(i => cells.h[i] >= 70).sort((a, b) => cells.h[b] - cells.h[a])); - let quantity = getQuantity(mountains, 10, 300); + let quantity = getQuantity(mountains, 10, 300, multiplier); if (!quantity) return; const highestMountains = mountains.slice(0, 20); while (quantity) { const [cell] = extractAnyElement(highestMountains); - const id = addMarker({cell, icon: "🌋", type: "volcano", dx: 52, px: 13}); + const id = addMarker({cell, icon, type, dx: 52, px: 13}); const proper = Names.getCulture(cells.culture[cell]); const name = P(0.3) ? "Mount " + proper : Math.random() > 0.3 ? proper + " Volcano" : proper; notes.push({id, name, legend: `Active volcano. Height: ${getFriendlyHeight(cells.p[cell])}`}); @@ -86,17 +121,17 @@ window.Markers = (function () { } } - function addHotSprings() { + function addHotSprings(type, icon, multiplier) { const {cells} = pack; let springs = Array.from(cells.i.filter(i => cells.h[i] > 50).sort((a, b) => cells.h[b] - cells.h[a])); - let quantity = getQuantity(springs, 30, 800); + let quantity = getQuantity(springs, 30, 800, multiplier); if (!quantity) return; const highestSprings = springs.slice(0, 40); while (quantity) { const [cell] = extractAnyElement(highestSprings); - const id = addMarker({cell, icon: "♨️", type: "hot_springs", dy: 52}); + const id = addMarker({cell, icon, type, dy: 52}); const proper = Names.getCulture(cells.culture[cell]); const temp = convertTemperature(gauss(35, 15, 20, 100)); notes.push({id, name: proper + " Hot Springs", legend: `A hot springs area. Average temperature: ${temp}`}); @@ -104,18 +139,18 @@ window.Markers = (function () { } } - function addMines() { + function addMines(type, icon, multiplier) { const {cells} = pack; let hillyBurgs = Array.from(cells.i.filter(i => cells.h[i] > 47 && cells.burg[i])); - let quantity = getQuantity(hillyBurgs, 1, 15); + let quantity = getQuantity(hillyBurgs, 1, 15, multiplier); if (!quantity) return; const resources = {salt: 5, gold: 2, silver: 4, copper: 2, iron: 3, lead: 1, tin: 1}; while (quantity && hillyBurgs.length) { const [cell] = extractAnyElement(hillyBurgs); - const id = addMarker({cell, icon: "⛏️", type: "mine", dx: 48, px: 13}); + const id = addMarker({cell, icon, type, dx: 48, px: 13}); const resource = rw(resources); const burg = pack.burgs[cells.burg[cell]]; const name = `${burg.name} — ${resource} mining town`; @@ -126,19 +161,19 @@ window.Markers = (function () { } } - function addBridges() { + function addBridges(type, icon, multiplier) { const {cells, burgs} = pack; const meanFlux = d3.mean(cells.fl.filter(fl => fl)); let bridges = Array.from( cells.i.filter(i => cells.burg[i] && cells.t[i] !== 1 && burgs[cells.burg[i]].population > 20 && cells.r[i] && cells.fl[i] > meanFlux) ); - let quantity = getQuantity(bridges, 1, 5); + let quantity = getQuantity(bridges, 1, 5, multiplier); if (!quantity) return; while (quantity) { const [cell] = extractAnyElement(bridges); - const id = addMarker({cell, icon: "🌉", type: "bridge", px: 14}); + const id = addMarker({cell, icon, type, px: 14}); const burg = pack.burgs[cells.burg[cell]]; const river = pack.rivers.find(r => r.i === pack.cells.r[cell]); const riverName = river ? `${river.name} ${river.type}` : "river"; @@ -148,11 +183,11 @@ window.Markers = (function () { } } - function addInns() { + function addInns(type, icon, multiplier) { const {cells} = pack; let taverns = Array.from(cells.i.filter(i => cells.h[i] >= 20 && cells.road[i] > 4 && cells.pop[i] > 10)); - let quantity = getQuantity(taverns, 1, 100); + let quantity = getQuantity(taverns, 1, 100, multiplier); if (!quantity) return; const colors = [ @@ -385,61 +420,61 @@ window.Markers = (function () { while (quantity) { const [cell] = extractAnyElement(taverns); - const id = addMarker({cell, icon: "🍻", type: "inn", px: 14}); - const type = P(0.3) ? "inn" : "tavern"; + const id = addMarker({cell, icon, type, px: 14}); + const typeName = P(0.3) ? "inn" : "tavern"; const isAnimalThemed = P(0.7); const animal = ra(animals); const name = isAnimalThemed ? (P(0.6) ? ra(colors) + " " + animal : ra(adjectives) + " " + animal) : ra(adjectives) + " " + capitalize(type); const meal = isAnimalThemed && P(0.3) ? animal : ra(courses); const course = `${ra(methods)} ${meal}`.toLowerCase(); const drink = `${P(0.5) ? ra(types) : ra(colors)} ${ra(drinks)}`.toLowerCase(); - const legend = `A big and famous roadside ${type}. Delicious ${course} with ${drink} is served here`; + const legend = `A big and famous roadside ${typeName}. Delicious ${course} with ${drink} is served here`; notes.push({id, name: "The " + name, legend}); quantity--; } } - function addLighthouses() { + function addLighthouses(type, icon, multiplier) { const {cells} = pack; const lighthouses = Array.from(cells.i.filter(i => cells.harbor[i] > 6 && cells.c[i].some(c => cells.h[c] < 20 && cells.road[c]))); - let quantity = getQuantity(lighthouses, 1, 2); + let quantity = getQuantity(lighthouses, 1, 2, multiplier); if (!quantity) return; while (quantity) { const [cell] = extractAnyElement(lighthouses); - const id = addMarker({cell, icon: "🚨", type: "lighthouse", px: 14}); + const id = addMarker({cell, icon, type, px: 14}); const proper = cells.burg[cell] ? pack.burgs[cells.burg[cell]].name : Names.getCulture(cells.culture[cell]); notes.push({id, name: getAdjective(proper) + " Lighthouse" + name, legend: `A lighthouse to keep the navigation safe`}); quantity--; } } - function addWaterfalls() { + function addWaterfalls(type, icon, multiplier) { const {cells} = pack; const waterfalls = Array.from(cells.i.filter(i => cells.r[i] && cells.h[i] >= 50 && cells.c[i].some(c => cells.h[c] < 40 && cells.r[c]))); - const quantity = getQuantity(waterfalls, 1, 5); + const quantity = getQuantity(waterfalls, 1, 5, multiplier); if (!quantity) return; for (let i = 0; i < waterfalls.length && i < quantity; i++) { const cell = waterfalls[i]; - const id = addMarker({cell, icon: "⟱", type: "waterfall", dy: 54, px: 16}); + const id = addMarker({cell, icon, type, dy: 54, px: 16}); const proper = cells.burg[cell] ? pack.burgs[cells.burg[cell]].name : Names.getCulture(cells.culture[cell]); notes.push({id, name: getAdjective(proper) + " Waterfall" + name, legend: `An extremely beautiful waterfall`}); } } - function addBattlefields() { + function addBattlefields(type, icon, multiplier) { const {cells, states} = pack; let battlefields = Array.from(cells.i.filter(i => cells.state[i] && cells.pop[i] > 2 && cells.h[i] < 50 && cells.h[i] > 25)); - let quantity = getQuantity(battlefields, 50, 700); + let quantity = getQuantity(battlefields, 50, 700, multiplier); if (!quantity) return; while (quantity && battlefields.length) { const [cell] = extractAnyElement(battlefields); - const id = addMarker({cell, icon: "⚔️", type: "battlefield", dy: 52}); + const id = addMarker({cell, icon, type, dy: 52}); const campaign = ra(states[cells.state[cell]].campaigns); const date = generateDate(campaign.start, campaign.end); const name = Names.getCulture(cells.culture[cell]) + " Battlefield"; @@ -449,16 +484,16 @@ window.Markers = (function () { } } - function addDungeons() { + function addDungeons(type, icon, multiplier) { const {cells} = pack; let dungeons = Array.from(cells.i.filter(i => cells.pop[i] && cells.pop[i] < 3)); - let quantity = getQuantity(dungeons, 30, 200); + let quantity = getQuantity(dungeons, 30, 200, multiplier); if (!quantity) return; while (quantity) { const [cell] = extractAnyElement(dungeons); - const id = addMarker({cell, icon: "🗝️", type: "dungeon", dy: 51, px: 13}); + const id = addMarker({cell, icon, type, dy: 51, px: 13}); const dungeonSeed = `${seed}${cell}`; const name = "Dungeon"; @@ -468,17 +503,17 @@ window.Markers = (function () { } } - function addLakeMonsters() { + function addLakeMonsters(type, icon, multiplier) { const {features} = pack; const lakes = features.filter(feature => feature.type === "lake" && feature.group === "freshwater"); - let quantity = getQuantity(lakes, 2, 10); + let quantity = getQuantity(lakes, 2, 10, multiplier); if (!quantity) return; while (quantity) { const [lake] = extractAnyElement(lakes); const cell = lake.firstCell; - const id = addMarker({cell, icon: "🐉", type: "lake_monster", dy: 48}); + const id = addMarker({cell, icon, type, dy: 48}); const name = `${lake.name} Monster`; const length = gauss(10, 5, 5, 100); const legend = `Rumors said a relic monster of ${length} ${heightUnit.value} long inhabits ${lake.name} Lake. Truth or lie, but folks are affraid to fish in the lake`; @@ -487,16 +522,16 @@ window.Markers = (function () { } } - function addSeaMonsters() { + function addSeaMonsters(type, icon, multiplier) { const {cells, features} = pack; const sea = Array.from(cells.i.filter(i => cells.h[i] < 20 && cells.road[i] && features[cells.f[i]].type === "ocean")); - let quantity = getQuantity(sea, 50, 700); + let quantity = getQuantity(sea, 50, 700, multiplier); if (!quantity) return; while (quantity) { const [cell] = extractAnyElement(sea); - const id = addMarker({cell, icon: "🦑", type: "sea_monster"}); + const id = addMarker({cell, icon, type}); const name = `${Names.getCultureShort(0)} Monster`; const length = gauss(25, 10, 10, 100); const legend = `Old sailors tell stories of a gigantic sea monster inhabiting these dangerous waters. Rumors say it can be ${length} ${heightUnit.value} long`; @@ -505,11 +540,11 @@ window.Markers = (function () { } } - function addHillMonsters() { + function addHillMonsters(type, icon, multiplier) { const {cells} = pack; const hills = Array.from(cells.i.filter(i => cells.h[i] >= 50 && cells.pop[i])); - let quantity = getQuantity(hills, 30, 600); + let quantity = getQuantity(hills, 30, 600, multiplier); if (!quantity) return; const subjects = ["Locals", "Old folks", "Old books", "Tipplers"]; @@ -525,7 +560,7 @@ window.Markers = (function () { while (quantity) { const [cell] = extractAnyElement(hills); - const id = addMarker({cell, icon: "👹", type: "hill_monster", dy: 54, px: 13}); + const id = addMarker({cell, icon, type, dy: 54, px: 13}); const monster = ra(species); const toponym = Names.getCulture(cells.culture[cell]); const name = `${toponym} ${monster}`; @@ -535,16 +570,16 @@ window.Markers = (function () { } } - function addSacredMountains() { + function addSacredMountains(type, icon, multiplier) { const {cells, cultures} = pack; let lonelyMountains = Array.from(cells.i.filter(i => cells.h[i] >= 70 && cells.c[i].some(c => cells.culture[c]) && cells.c[i].every(c => cells.h[c] < 60))); - let quantity = getQuantity(lonelyMountains, 1, 5); + let quantity = getQuantity(lonelyMountains, 1, 5, multiplier); if (!quantity) return; while (quantity) { const [cell] = extractAnyElement(lonelyMountains); - const id = addMarker({cell, icon: "🗻", type: "sacred_mountain", dy: 48}); + const id = addMarker({cell, icon, type, dy: 48}); const culture = cells.c[cell].map(c => cells.culture[c]).find(c => c); const name = `${Names.getCulture(culture)} Mountain`; const height = getFriendlyHeight(cells.p[cell]); @@ -554,16 +589,16 @@ window.Markers = (function () { } } - function addSacredForests() { + function addSacredForests(type, icon, multiplier) { const {cells, cultures} = pack; let temperateForests = Array.from(cells.i.filter(i => cells.culture[i] && [6, 8].includes(cells.biome[i]))); - let quantity = getQuantity(temperateForests, 30, 1000); + let quantity = getQuantity(temperateForests, 30, 1000, multiplier); if (!quantity) return; while (quantity) { const [cell] = extractAnyElement(temperateForests); - const id = addMarker({cell, icon: "🌳", type: "sacred_forest"}); + const id = addMarker({cell, icon, type}); const culture = cells.culture[cell]; const name = `${Names.getCulture(culture)} Forest`; const legend = `A sacred forest of ${cultures[culture].name} culture`; @@ -572,16 +607,16 @@ window.Markers = (function () { } } - function addSacredPineries() { + function addSacredPineries(type, icon, multiplier) { const {cells, cultures} = pack; let borealForests = Array.from(cells.i.filter(i => cells.culture[i] && cells.biome[i] === 9)); - let quantity = getQuantity(borealForests, 30, 800); + let quantity = getQuantity(borealForests, 30, 800, multiplier); if (!quantity) return; while (quantity) { const [cell] = extractAnyElement(borealForests); - const id = addMarker({cell, icon: "🌲", type: "pinery", px: 13}); + const id = addMarker({cell, icon, type, px: 13}); const culture = cells.culture[cell]; const name = `${Names.getCulture(culture)} Pinery`; const legend = `A sacred pinery of ${cultures[culture].name} culture`; @@ -590,16 +625,16 @@ window.Markers = (function () { } } - function addSacredPalmGroves() { + function addSacredPalmGroves(type, icon, multiplier) { const {cells, cultures} = pack; let oasises = Array.from(cells.i.filter(i => cells.culture[i] && cells.biome[i] === 1 && cells.pop[i] > 1 && cells.road[i])); - let quantity = getQuantity(oasises, 1, 100); + let quantity = getQuantity(oasises, 1, 100, multiplier); if (!quantity) return; while (quantity) { const [cell] = extractAnyElement(oasises); - const id = addMarker({cell, icon: "🌴", type: "palm_grove", px: 13}); + const id = addMarker({cell, icon, type, px: 13}); const culture = cells.culture[cell]; const name = `${Names.getCulture(culture)} Palm Grove`; const legend = `A sacred palm grove of ${cultures[culture].name} culture`; @@ -608,11 +643,11 @@ window.Markers = (function () { } } - function addBrigands() { + function addBrigands(type, icon, multiplier) { const {cells} = pack; let roads = Array.from(cells.i.filter(i => cells.culture[i] && cells.road[i] > 4)); - let quantity = getQuantity(roads, 50, 100); + let quantity = getQuantity(roads, 50, 100, multiplier); if (!quantity) return; const animals = [ @@ -651,7 +686,7 @@ window.Markers = (function () { while (quantity) { const [cell] = extractAnyElement(roads); - const id = addMarker({cell, icon: "💰", type: "brigands", px: 13}); + const id = addMarker({cell, icon, type, px: 13}); const culture = cells.culture[cell]; const biome = cells.biome[cell]; const height = cells.p[cell]; @@ -674,16 +709,16 @@ window.Markers = (function () { } } - function addPirates() { + function addPirates(type, icon, multiplier) { const {cells} = pack; let searoutes = Array.from(cells.i.filter(i => cells.h[i] < 20 && cells.road[i])); - let quantity = getQuantity(searoutes, 40, 300); + let quantity = getQuantity(searoutes, 40, 300, multiplier); if (!quantity) return; while (quantity) { const [cell] = extractAnyElement(searoutes); - const id = addMarker({cell, type: "pirates", icon: "🏴‍☠️", dx: 51}); + const id = addMarker({cell, icon, type, dx: 51}); const name = `Pirates`; const legend = `Pirate ships have been spotted in these waters`; notes.push({id, name, legend}); @@ -691,13 +726,13 @@ window.Markers = (function () { } } - function addStatues() { + function addStatues(type, icon, multiplier) { const {cells} = pack; let statues = Array.from(cells.i.filter(i => cells.h[i] >= 20 && cells.h[i] < 40)); - let quantity = getQuantity(statues, 80, 1200); + let quantity = getQuantity(statues, 80, 1200, multiplier); if (!quantity) return; - const types = ["Statue", "Obelisk", "Monument", "Column", "Monolith", "Pillar", "Megalith", "Stele", "Runestone"]; + const variants = ["Statue", "Obelisk", "Monument", "Column", "Monolith", "Pillar", "Megalith", "Stele", "Runestone"]; const scripts = { cypriot: "𐠁𐠂𐠃𐠄𐠅𐠈𐠊𐠋𐠌𐠍𐠎𐠏𐠐𐠑𐠒𐠓𐠔𐠕𐠖𐠗𐠘𐠙𐠚𐠛𐠜𐠝𐠞𐠟𐠠𐠡𐠢𐠣𐠤𐠥𐠦𐠧𐠨𐠩𐠪𐠫𐠬𐠭𐠮𐠯𐠰𐠱𐠲𐠳𐠴𐠵𐠷𐠸𐠼𐠿 ", geez: "ሀለሐመሠረሰቀበተኀነአከወዐዘየደገጠጰጸፀፈፐ ", @@ -708,54 +743,53 @@ window.Markers = (function () { while (quantity) { const [cell] = extractAnyElement(statues); - const id = addMarker({cell, icon: "🗿", type: "statues"}); + const id = addMarker({cell, icon, type}); const culture = cells.culture[cell]; - const type = ra(types); - const name = `${Names.getCulture(culture)} ${type}`; + const variant = ra(variants); + const name = `${Names.getCulture(culture)} ${variant}`; const script = scripts[ra(Object.keys(scripts))]; const inscription = Array(rand(40, 100)) .fill(null) .map(() => ra(script)) .join(""); - const legend = `An ancient ${type.toLowerCase()}. It has an inscription, but no one can translate it: + const legend = `An ancient ${variant.toLowerCase()}. It has an inscription, but no one can translate it:
${inscription}
`; notes.push({id, name, legend}); quantity--; } } - function addRuines() { + function addRuines(type, icon, multiplier) { const {cells} = pack; let ruins = Array.from(cells.i.filter(i => cells.culture[i] && cells.h[i] >= 20 && cells.h[i] < 60)); - let quantity = getQuantity(ruins, 80, 1200); + let quantity = getQuantity(ruins, 80, 1200, multiplier); if (!quantity) return; const types = ["City", "Town", "Pyramid", "Fort"]; while (quantity) { const [cell] = extractAnyElement(ruins); - const id = addMarker({cell, icon: "🏺", type: "ruins"}); + const id = addMarker({cell, icon, type}); - const type = ra(types); - const name = `Ruined ${type}`; - const legend = `Ruins of an ancient ${type.toLowerCase()}. A good place for a treasures hunt`; + const ruinType = ra(types); + const name = `Ruined ${ruinType}`; + const legend = `Ruins of an ancient ${ruinType.toLowerCase()}. A good place for a treasures hunt`; notes.push({id, name, legend}); quantity--; } } - function addPortals() { + function addPortals(type, icon, multiplier) { const {burgs} = pack; - - let quantity = rand(5, 15); - if (burgs.length < quantity + 1) return; - let portals = burgs.slice(1, quantity + 1).map(burg => [burg.name, burg.cell]); + let portals = burgs.slice(1, rand(12, 30) + 1).map(burg => [burg.name, burg.cell]); + let quantity = getQuantity(portals, 10, 3, multiplier); + if (!quantity) return; while (quantity) { const [portal] = extractAnyElement(portals); const [burgName, cell] = portal; - const id = addMarker({cell, icon: "🌀", type: "portals", px: 14}); + const id = addMarker({cell, icon, type, px: 14}); const name = `${burgName} Portal`; const legend = `An element of the magic portal system connecting major cities. Portals installed centuries ago, but still work fine`; notes.push({id, name, legend}); @@ -763,16 +797,5 @@ window.Markers = (function () { } } - function addMarker({cell, type, icon, dx, dy, px}) { - const i = pack.markers.length; - const [x, y] = getMarkerCoordinates(cell); - const marker = {i, icon, type, x, y}; - if (dx) marker.dx = dx; - if (dy) marker.dy = dy; - if (px) marker.px = px; - pack.markers.push(marker); - return "marker" + i; - } - - return {generate, regenerate}; + return {generate, regenerate, getConfig, setConfig}; })(); diff --git a/modules/ui/tools.js b/modules/ui/tools.js index 15ff2ee4..1e9359a2 100644 --- a/modules/ui/tools.js +++ b/modules/ui/tools.js @@ -1,5 +1,5 @@ -// module to control the Tools options (click to edit, to re-geenerate, tp add) "use strict"; +// module to control the Tools options (click to edit, to re-geenerate, tp add) toolsContent.addEventListener("click", function (event) { if (customization) { @@ -9,7 +9,7 @@ toolsContent.addEventListener("click", function (event) { if (event.target.tagName !== "BUTTON") return; const button = event.target.id; - // Click to open Editor buttons + // click on open Editor buttons if (button === "editHeightmapButton") editHeightmap(); else if (button === "editBiomesButton") editBiomes(); else if (button === "editStatesButton") editStates(); @@ -27,7 +27,7 @@ toolsContent.addEventListener("click", function (event) { else if (button === "overviewMilitaryButton") overviewMilitary(); else if (button === "overviewCellsButton") viewCellDetails(); - // Click to Regenerate buttons + // click on Regenerate buttons if (event.target.parentNode.id === "regenerateFeature") { if (sessionStorage.getItem("regenerateFeatureDontAsk")) { processFeatureRegeneration(event, button); @@ -62,7 +62,11 @@ toolsContent.addEventListener("click", function (event) { }); } - // Click to Add buttons + // click on Configure regenerate buttons + if (button === "configRegenerateMarkers") { + } + + // click on Add buttons if (button === "addLabel") toggleAddLabel(); else if (button === "addBurgTool") toggleAddBurg(); else if (button === "addRiver") toggleAddRiver(); @@ -90,7 +94,7 @@ function processFeatureRegeneration(event, button) { else if (button === "regenerateCultures") regenerateCultures(); else if (button === "regenerateMilitary") regenerateMilitary(); else if (button === "regenerateIce") regenerateIce(); - else if (button === "regenerateMarkers") regenerateMarkers(event); + else if (button === "regenerateMarkers") regenerateMarkers(); else if (button === "regenerateZones") regenerateZones(event); } @@ -416,23 +420,10 @@ function regenerateIce() { drawIce(); } -function regenerateMarkers(event) { - if (isCtrlClick(event)) prompt("Please provide markers number multiplier", {default: 1, step: 0.01, min: 0, max: 100}, v => addNumberOfMarkers(v)); - else addNumberOfMarkers(); - - function addNumberOfMarkers(multiplier) { - pack.markers = pack.markers.filter(marker => { - if (marker.lock) return true; - document.getElementById(`marker${marker.i}`)?.remove(); - const index = notes.findIndex(note => note.id === marker.id); - if (index != -1) notes.splice(index, 1); - return false; - }); - - Markers.regenerate(multiplier); - turnButtonOn("toggleMarkers"); - drawMarkers(); - } +function regenerateMarkers() { + Markers.regenerate(); + turnButtonOn("toggleMarkers"); + drawMarkers(); } function regenerateZones(event) {