diff --git a/main.js b/main.js index eb4c47157..3ab242d74 100644 --- a/main.js +++ b/main.js @@ -10,6 +10,12 @@ const version = "1.4"; // generator version document.title += " v" + version; +// Switches to disable/enable logging features +const INFO = 0; +const TIME = 0; +const WARN = 1; +const ERROR = 1; + // if map version is not stored, clear localStorage and show a message if (rn(localStorage.getItem("version"), 2) !== rn(version, 2)) { localStorage.clear(); @@ -142,7 +148,7 @@ void function checkLoadParameters() { // of there is a valid maplink, try to load .map file from URL if (params.get("maplink")) { - console.warn("Load map from URL"); + WARN && console.warn("Load map from URL"); const maplink = params.get("maplink"); const pattern = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/; const valid = pattern.test(maplink); @@ -152,7 +158,7 @@ void function checkLoadParameters() { // if there is a seed (user of MFCG provided), generate map for it if (params.get("seed")) { - console.warn("Generate map for seed"); + WARN && console.warn("Generate map for seed"); generateMapOnLoad(); return; } @@ -161,24 +167,24 @@ void function checkLoadParameters() { if (onloadMap.value === "saved") { ldb.get("lastMap", blob => { if (blob) { - console.warn("Load last saved map"); + WARN && console.warn("Load last saved map"); try { uploadMap(blob); } catch(error) { - console.error(error); - console.warn("Cannot load stored map, random map to be generated"); + ERROR && console.error(error); + WARN && console.warn("Cannot load stored map, random map to be generated"); generateMapOnLoad(); } } else { - console.error("No map stored, random map to be generated"); + ERROR && console.error("No map stored, random map to be generated"); generateMapOnLoad(); } }); return; } - console.warn("Generate random map"); + WARN && console.warn("Generate random map"); generateMapOnLoad(); }() @@ -197,7 +203,7 @@ function loadMapFromURL(maplink, random) { } function showUploadErrorMessage(error, URL, random) { - console.error(error); + ERROR && console.error(error); alertMessage.innerHTML = `Cannot load map from the ${link(URL, "link provided")}. ${random?`A new random map is generated. `:''} Please ensure the linked file is reachable and CORS is allowed on server side`; @@ -249,7 +255,7 @@ function focusOn() { // find burg for MFCG and focus on it function findBurgForMFCG(params) { const cells = pack.cells, burgs = pack.burgs; - if (pack.burgs.length < 2) {console.error("Cannot select a burg for MFCG"); return;} + if (pack.burgs.length < 2) {ERROR && console.error("Cannot select a burg for MFCG"); return;} // used for selection const size = +params.get("size"); @@ -274,7 +280,7 @@ function findBurgForMFCG(params) { // select a burg with closest population from selection const selected = d3.scan(selection, (a, b) => Math.abs(a.population - size) - Math.abs(b.population - size)); const burgId = selection[selected].i; - if (!burgId) {console.error("Cannot select a burg for MFCG"); return;} + if (!burgId) {ERROR && console.error("Cannot select a burg for MFCG"); return;} const b = burgs[burgId]; const referrer = new URL(document.referrer); @@ -507,7 +513,7 @@ function generate() { const timeStart = performance.now(); invokeActiveZooming(); generateSeed(); - console.group("Generated Map " + seed); + INFO && console.group("Generated Map " + seed); applyMapSize(); randomizeOptions(); placePoints(); @@ -548,12 +554,12 @@ function generate() { addZones(); Names.getMapName(); - console.warn(`TOTAL: ${rn((performance.now()-timeStart)/1000,2)}s`); + WARN && console.warn(`TOTAL: ${rn((performance.now()-timeStart)/1000,2)}s`); showStatistics(); - console.groupEnd("Generated Map " + seed); + INFO && console.groupEnd("Generated Map " + seed); } catch(error) { - console.error(error); + ERROR && console.error(error); clearMainTip(); alertMessage.innerHTML = `An error is occured on map generation. Please retry. @@ -586,35 +592,35 @@ function generateSeed() { // Place points to calculate Voronoi diagram function placePoints() { - console.time("placePoints"); + TIME && console.time("placePoints"); const cellsDesired = 10000 * densityInput.value; // generate 10k points for each densityInput point const spacing = grid.spacing = rn(Math.sqrt(graphWidth * graphHeight / cellsDesired), 2); // spacing between points before jirrering grid.boundary = getBoundaryPoints(graphWidth, graphHeight, spacing); grid.points = getJitteredGrid(graphWidth, graphHeight, spacing); // jittered square grid grid.cellsX = Math.floor((graphWidth + 0.5 * spacing) / spacing); grid.cellsY = Math.floor((graphHeight + 0.5 * spacing) / spacing); - console.timeEnd("placePoints"); + TIME && console.timeEnd("placePoints"); } // calculate Delaunay and then Voronoi diagram function calculateVoronoi(graph, points) { - console.time("calculateDelaunay"); + TIME && console.time("calculateDelaunay"); const n = points.length; const allPoints = points.concat(grid.boundary); const delaunay = Delaunator.from(allPoints); - console.timeEnd("calculateDelaunay"); + TIME && console.timeEnd("calculateDelaunay"); - console.time("calculateVoronoi"); + TIME && console.time("calculateVoronoi"); const voronoi = Voronoi(delaunay, allPoints, n); graph.cells = voronoi.cells; graph.cells.i = n < 65535 ? Uint16Array.from(d3.range(n)) : Uint32Array.from(d3.range(n)); // array of indexes graph.vertices = voronoi.vertices; - console.timeEnd("calculateVoronoi"); + TIME && console.timeEnd("calculateVoronoi"); } // Mark features (ocean, lakes, islands) function markFeatures() { - console.time("markFeatures"); + TIME && console.time("markFeatures"); Math.seedrandom(seed); // restart Math.random() to get the same result on heightmap edit in Erase mode const cells = grid.cells, heights = grid.cells.h; cells.f = new Uint16Array(cells.i.length); // cell feature number @@ -648,7 +654,7 @@ function markFeatures() { queue[0] = cells.f.findIndex(f => !f); // find unmarked cell } - console.timeEnd("markFeatures"); + TIME && console.timeEnd("markFeatures"); } // How to handle lakes generated near seas? They can be both open or closed. @@ -658,7 +664,7 @@ function openNearSeaLakes() { if (templateInput.value === "Atoll") return; // no need for Atolls const cells = grid.cells, features = grid.features; if (!features.find(f => f.type === "lake")) return; // no lakes - console.time("openLakes"); + TIME && console.time("openLakes"); const limit = 50; // max height that can be breached by water for (let t = 0, removed = true; t < 5 && removed; t++) { @@ -694,7 +700,7 @@ function openNearSeaLakes() { return true; } - console.timeEnd("openLakes"); + TIME && console.timeEnd("openLakes"); } // define map size and position based on template and random factor @@ -745,7 +751,7 @@ function calculateMapCoordinates() { // temperature model function calculateTemperatures() { - console.time('calculateTemperatures'); + TIME && console.time('calculateTemperatures'); const cells = grid.cells; cells.temp = new Int8Array(cells.i.length); // temperature array @@ -771,12 +777,12 @@ function calculateTemperatures() { return rn(height / 1000 * 6.5); } - console.timeEnd('calculateTemperatures'); + TIME && console.timeEnd('calculateTemperatures'); } // simplest precipitation model function generatePrecipitation() { - console.time('generatePrecipitation'); + TIME && console.time('generatePrecipitation'); prec.selectAll("*").remove(); const cells = grid.cells; cells.prec = new Uint8Array(cells.i.length); // precipitation array @@ -887,12 +893,12 @@ function generatePrecipitation() { if (southerly) wind.append("text").attr("x", graphWidth / 2).attr("y", graphHeight - 20).text("\u21C8"); }(); - console.timeEnd('generatePrecipitation'); + TIME && console.timeEnd('generatePrecipitation'); } // recalculate Voronoi Graph to pack cells function reGraph() { - console.time("reGraph"); + TIME && console.time("reGraph"); let cells = grid.cells, points = grid.points, features = grid.features; const newCells = {p:[], g:[], h:[], t:[], f:[], r:[], biome:[]}; // to store new data const spacing2 = grid.spacing ** 2; @@ -936,12 +942,12 @@ function reGraph() { cells.area = new Uint16Array(cells.i.length); // cell area cells.i.forEach(i => cells.area[i] = Math.abs(d3.polygonArea(getPackPolygon(i)))); - console.timeEnd("reGraph"); + TIME && console.timeEnd("reGraph"); } // Detect and draw the coasline function drawCoastline() { - console.time('drawCoastline'); + TIME && console.time('drawCoastline'); reMarkFeatures(); const cells = pack.cells, vertices = pack.vertices, n = cells.i.length, features = pack.features; const used = new Uint8Array(features.length); // store conneted features @@ -1016,7 +1022,7 @@ function drawCoastline() { if (v[0] !== prev && c0 !== c1) current = v[0]; else if (v[1] !== prev && c1 !== c2) current = v[1]; else if (v[2] !== prev && c0 !== c2) current = v[2]; - if (current === chain[chain.length-1]) {console.error("Next vertex is not found"); break;} + if (current === chain[chain.length-1]) {ERROR && console.error("Next vertex is not found"); break;} } //chain.push(chain[0]); // push first vertex as the last one return chain; @@ -1040,12 +1046,12 @@ function drawCoastline() { } } - console.timeEnd('drawCoastline'); + TIME && console.timeEnd('drawCoastline'); } // Re-mark features (ocean, lakes, islands) function reMarkFeatures() { - console.time("reMarkFeatures"); + TIME && console.time("reMarkFeatures"); const cells = pack.cells, features = pack.features = [0], temp = grid.cells.temp; cells.f = new Uint16Array(cells.i.length); // cell feature number cells.t = new Int16Array(cells.i.length); // cell type: 1 = land along coast; -1 = water along coast; @@ -1113,13 +1119,13 @@ function reMarkFeatures() { return "isle"; } - console.timeEnd("reMarkFeatures"); + TIME && console.timeEnd("reMarkFeatures"); } // temporary elevate some lakes to resolve depressions and flux the water to form an open (exorheic) lake function elevateLakes() { if (templateInput.value === "Atoll") return; // no need for Atolls - console.time('elevateLakes'); + TIME && console.time('elevateLakes'); const cells = pack.cells, features = pack.features; const maxCells = cells.i.length / 100; // size limit; let big lakes be closed (endorheic) cells.i.forEach(i => { @@ -1129,12 +1135,12 @@ function elevateLakes() { //debug.append("circle").attr("cx", cells.p[i][0]).attr("cy", cells.p[i][1]).attr("r", .5).attr("fill", "blue"); }); - console.timeEnd('elevateLakes'); + TIME && console.timeEnd('elevateLakes'); } // assign biome id for each cell function defineBiomes() { - console.time("defineBiomes"); + TIME && console.time("defineBiomes"); const cells = pack.cells, f = pack.features, temp = grid.cells.temp, prec = grid.cells.prec; cells.biome = new Uint8Array(cells.i.length); // biomes array @@ -1153,7 +1159,7 @@ function defineBiomes() { return rn(4 + d3.mean(n)); } - console.timeEnd("defineBiomes"); + TIME && console.timeEnd("defineBiomes"); } // assign biome id to a cell @@ -1168,7 +1174,7 @@ function getBiomeId(moisture, temperature, height) { // assess cells suitability to calculate population and rand cells for culture center and burgs placement function rankCells() { - console.time('rankCells'); + TIME && console.time('rankCells'); const cells = pack.cells, f = pack.features; cells.s = new Int16Array(cells.i.length); // cell suitability array cells.pop = new Float32Array(cells.i.length); // cell population array @@ -1202,13 +1208,13 @@ function rankCells() { cells.pop[i] = cells.s[i] > 0 ? cells.s[i] * cells.area[i] / areaMean : 0; } - console.timeEnd('rankCells'); + TIME && console.timeEnd('rankCells'); } // generate some markers function addMarkers(number = 1) { if (!number) return; - console.time("addMarkers"); + TIME && console.time("addMarkers"); const cells = pack.cells, states = pack.states; void function addVolcanoes() { @@ -1374,12 +1380,12 @@ function addMarkers(number = 1) { return id; } - console.timeEnd("addMarkers"); + TIME && console.timeEnd("addMarkers"); } // regenerate some zones function addZones(number = 1) { - console.time("addZones"); + TIME && console.time("addZones"); const data = [], cells = pack.cells, states = pack.states, burgs = pack.burgs; const used = new Uint8Array(cells.i.length); // to store used cells @@ -1690,7 +1696,7 @@ function addZones(number = 1) { .attr("points", d => getPackPolygon(d)).attr("id", function(d) {return this.parentNode.id+"_"+d}); }() - console.timeEnd("addZones"); + TIME && console.timeEnd("addZones"); } // show map stats on generation complete @@ -1712,11 +1718,11 @@ function showStatistics() { mapId = Date.now(); // unique map id is it's creation date number mapHistory.push({seed, width:graphWidth, height:graphHeight, template, created:mapId}); - console.log(stats); + INFO && console.log(stats); } const regenerateMap = debounce(function() { - console.warn("Generate new random map"); + WARN && console.warn("Generate new random map"); closeDialogs("#worldConfigurator, #options3d"); customization = 0; undraw(); diff --git a/modules/burgs-and-states.js b/modules/burgs-and-states.js index 4cc36e2d4..bbb48e4f5 100644 --- a/modules/burgs-and-states.js +++ b/modules/burgs-and-states.js @@ -32,7 +32,7 @@ drawBurgs(); function placeCapitals() { - console.time('placeCapitals'); + TIME && console.time('placeCapitals'); let count = +regionsInput.value; let burgs = [0]; @@ -41,8 +41,8 @@ if (sorted.length < count * 10) { count = Math.floor(sorted.length / 10); - if (!count) {console.warn(`There is no populated cells. Cannot generate states`); return burgs;} - else {console.warn(`Not enough populated cells (${sorted.length}). Will generate only ${count} states`);} + if (!count) {WARN && console.warn(`There is no populated cells. Cannot generate states`); return burgs;} + else {WARN && console.warn(`Not enough populated cells (${sorted.length}). Will generate only ${count} states`);} } let burgsTree = d3.quadtree(); @@ -57,20 +57,20 @@ } if (i === sorted.length - 1) { - console.warn("Cannot place capitals with current spacing. Trying again with reduced spacing"); + WARN && console.warn("Cannot place capitals with current spacing. Trying again with reduced spacing"); burgsTree = d3.quadtree(); i = -1, burgs = [0], spacing /= 1.2; } } burgs[0] = burgsTree; - console.timeEnd('placeCapitals'); + TIME && console.timeEnd('placeCapitals'); return burgs; } // For each capital create a state function createStates() { - console.time('createStates'); + TIME && console.time('createStates'); const states = [{i:0, name: "Neutrals"}]; const colors = getColors(burgs.length-1); @@ -94,13 +94,13 @@ cells.burg[b.cell] = i; }); - console.timeEnd('createStates'); + TIME && console.timeEnd('createStates'); return states; } // place secondary settlements based on geo and economical evaluation function placeTowns() { - console.time('placeTowns'); + TIME && console.time('placeTowns'); const score = new Int16Array(cells.s.map(s => s * gauss(1,3,0,20,3))); // a bit randomized cell score for towns placement const sorted = cells.i.filter(i => !cells.burg[i] && score[i] > 0 && cells.culture[i]).sort((a, b) => score[b] - score[a]); // filtered and sorted array of indexes @@ -129,17 +129,17 @@ } if (manorsInput.value != 1000 && burgsAdded < desiredNumber) { - console.error(`Cannot place all burgs. Requested ${desiredNumber}, placed ${burgsAdded}`); + ERROR && console.error(`Cannot place all burgs. Requested ${desiredNumber}, placed ${burgsAdded}`); } burgs[0] = {name:undefined}; // do not store burgsTree anymore - console.timeEnd('placeTowns'); + TIME && console.timeEnd('placeTowns'); } } // define burg coordinates, port status and define details const specifyBurgs = function() { - console.time("specifyBurgs"); + TIME && console.time("specifyBurgs"); const cells = pack.cells, vertices = pack.vertices, features = pack.features, temp = grid.cells.temp; for (const b of pack.burgs) { @@ -185,7 +185,7 @@ if (featurePorts.length === 1) featurePorts[0].port = 0; } - console.timeEnd("specifyBurgs"); + TIME && console.timeEnd("specifyBurgs"); } const defineBurgFeatures = function(newburg) { @@ -202,7 +202,7 @@ } const drawBurgs = function() { - console.time("drawBurgs"); + TIME && console.time("drawBurgs"); // remove old data burgIcons.selectAll("circle").remove(); @@ -251,12 +251,12 @@ .attr("x", d => rn(d.x - taSize * .47, 2)).attr("y", d => rn(d.y - taSize * .47, 2)) .attr("width", taSize).attr("height", taSize); - console.timeEnd("drawBurgs"); + TIME && console.timeEnd("drawBurgs"); } // growth algorithm to assign cells to states like we did for cultures const expandStates = function() { - console.time("expandStates"); + TIME && console.time("expandStates"); const cells = pack.cells, states = pack.states, cultures = pack.cultures, burgs = pack.burgs; cells.state = new Uint16Array(cells.i.length); // cell state @@ -331,11 +331,11 @@ return 0; } - console.timeEnd("expandStates"); + TIME && console.timeEnd("expandStates"); } const normalizeStates = function() { - console.time("normalizeStates"); + TIME && console.time("normalizeStates"); const cells = pack.cells, burgs = pack.burgs; for (const i of cells.i) { @@ -350,13 +350,13 @@ cells.state[i] = cells.state[adversaries[0]]; //debug.append("circle").attr("cx", cells.p[i][0]).attr("cy", cells.p[i][1]).attr("r", .5).attr("fill", "red"); } - console.timeEnd("normalizeStates"); + TIME && console.timeEnd("normalizeStates"); } // Resets the cultures of all burgs and states to their // cell or center cell's (respectively) culture. const updateCultures = function () { - console.time('updateCulturesForBurgsAndStates'); + TIME && console.time('updateCulturesForBurgsAndStates'); // Assign the culture associated with the burgs cell. pack.burgs = pack.burgs.map( (burg, index) => { @@ -376,12 +376,12 @@ return {...state, culture: pack.cells.culture[state.center]}; }); - console.timeEnd('updateCulturesForBurgsAndStates'); + TIME && console.timeEnd('updateCulturesForBurgsAndStates'); } // calculate and draw curved state labels for a list of states const drawStateLabels = function(list) { - console.time("drawStateLabels"); + TIME && console.time("drawStateLabels"); const cells = pack.cells, features = pack.features, states = pack.states; const paths = []; // text paths lineGen.curve(d3.curveBundle.beta(1)); @@ -563,12 +563,12 @@ if (!displayed) toggleLabels(); }() - console.timeEnd("drawStateLabels"); + TIME && console.timeEnd("drawStateLabels"); } // calculate states data like area, population etc. const collectStatistics = function() { - console.time("collectStatistics"); + TIME && console.time("collectStatistics"); const cells = pack.cells, states = pack.states; states.forEach(s => { s.cells = s.area = s.burgs = s.rural = s.urban = 0; @@ -595,11 +595,11 @@ // convert neighbors Set object into array states.forEach(s => s.neighbors = Array.from(s.neighbors)); - console.timeEnd("collectStatistics"); + TIME && console.timeEnd("collectStatistics"); } const assignColors = function() { - console.time("assignColors"); + TIME && console.time("assignColors"); const colors = ["#66c2a5", "#fc8d62", "#8da0cb", "#e78ac3", "#a6d854", "#ffd92f"]; // d3.schemeSet2; // assin basic color using greedy coloring algorithm @@ -620,7 +620,7 @@ }); }); - console.timeEnd("assignColors"); + TIME && console.timeEnd("assignColors"); } // generate historical conflicts of each state @@ -641,7 +641,7 @@ // generate Diplomatic Relationships const generateDiplomacy = function() { - console.time("generateDiplomacy"); + TIME && console.time("generateDiplomacy"); const cells = pack.cells, states = pack.states; const chronicle = states[0].diplomacy = []; const valid = states.filter(s => s.i && !states.removed); @@ -782,13 +782,13 @@ chronicle.push(war); // add a record to diplomatical history } - console.timeEnd("generateDiplomacy"); + TIME && console.timeEnd("generateDiplomacy"); //console.table(states.map(s => s.diplomacy)); } // select a forms for listed or all valid states const defineStateForms = function(list) { - console.time("defineStateForms"); + TIME && console.time("defineStateForms"); const states = pack.states.filter(s => s.i && !s.removed); if (states.length < 1) return; @@ -878,7 +878,7 @@ } } - console.timeEnd("defineStateForms"); + TIME && console.timeEnd("defineStateForms"); } const getFullName = function(s) { @@ -890,7 +890,7 @@ } const generateProvinces = function(regenerate) { - console.time("generateProvinces"); + TIME && console.time("generateProvinces"); const localSeed = regenerate ? Math.floor(Math.random() * 1e9).toString() : seed; Math.seedrandom(localSeed); @@ -1050,7 +1050,7 @@ } }); - console.timeEnd("generateProvinces"); + TIME && console.timeEnd("generateProvinces"); } return {generate, expandStates, normalizeStates, assignColors, diff --git a/modules/cultures-generator.js b/modules/cultures-generator.js index fa2cb253c..8e05018fe 100644 --- a/modules/cultures-generator.js +++ b/modules/cultures-generator.js @@ -7,7 +7,7 @@ let cells; const generate = function() { - console.time('generateCultures'); + TIME && console.time('generateCultures'); cells = pack.cells; cells.culture = new Uint16Array(cells.i.length); // cell cultures let count = Math.min(+culturesInput.value, +culturesSet.selectedOptions[0].dataset.max); @@ -16,7 +16,7 @@ if (populated.length < count * 25) { count = Math.floor(populated.length / 50); if (!count) { - console.warn(`There are no populated cells. Cannot generate cultures`); + WARN && console.warn(`There are no populated cells. Cannot generate cultures`); pack.cultures = [{name:"Wildlands", i:0, base:1}]; alertMessage.innerHTML = ` The climate is harsh and people cannot live in this world.
@@ -27,7 +27,7 @@ }); return; } else { - console.warn(`Not enough populated cells (${populated.length}). Will generate only ${count} cultures`); + WARN && console.warn(`Not enough populated cells (${populated.length}). Will generate only ${count} cultures`); alertMessage.innerHTML = ` There are only ${populated.length} populated cells and it's insufficient livable area.
Only ${count} out of ${culturesInput.value} requested cultures will be generated.
@@ -68,7 +68,7 @@ cultures.unshift({name:"Wildlands", i:0, base:1, origin:null}); // make sure all bases exist in nameBases - if (!nameBases.length) {console.error("Name base is empty, default nameBases will be applied"); nameBases = Names.getNameBases();} + if (!nameBases.length) {ERROR && console.error("Name base is empty, default nameBases will be applied"); nameBases = Names.getNameBases();} cultures.forEach(c => c.base = c.base % nameBases.length); function getRandomCultures(c) { @@ -108,7 +108,7 @@ return rn((Math.random() * powerInput.value / 2 + 1) * base, 1); } - console.timeEnd('generateCultures'); + TIME && console.timeEnd('generateCultures'); } // assign a unique two-letters code (abbreviation) @@ -355,7 +355,7 @@ // expand cultures across the map (Dijkstra-like algorithm) const expand = function() { - console.time('expandCultures'); + TIME && console.time('expandCultures'); cells = pack.cells; const queue = new PriorityQueue({comparator: (a, b) => a.p - b.p}); @@ -392,7 +392,7 @@ }); } //debug.selectAll(".text").data(cost).enter().append("text").attr("x", (d, e) => cells.p[e][0]-1).attr("y", (d, e) => cells.p[e][1]-1).text(d => d ? rn(d) : "").attr("font-size", 2); - console.timeEnd('expandCultures'); + TIME && console.timeEnd('expandCultures'); } function getBiomeCost(c, biome, type) { diff --git a/modules/heightmap-generator.js b/modules/heightmap-generator.js index dc2cf52b2..e469b4dce 100644 --- a/modules/heightmap-generator.js +++ b/modules/heightmap-generator.js @@ -7,7 +7,7 @@ let cells, p; const generate = function() { - console.time('generateHeightmap'); + TIME && console.time('generateHeightmap'); cells = grid.cells, p = grid.points; cells.h = new Uint8Array(grid.points.length); @@ -25,7 +25,7 @@ case "Shattered": templateShattered(); break; } - console.timeEnd('generateHeightmap'); + TIME && console.timeEnd('generateHeightmap'); } // parse template step @@ -507,7 +507,7 @@ } function getPointInRange(range, length) { - if (typeof range !== "string") {console.error("Range should be a string"); return;} + if (typeof range !== "string") {ERROR && console.error("Range should be a string"); return;} const min = range.split("-")[0]/100 || 0; const max = range.split("-")[1]/100 || 100; return rand(min * length, max * length); diff --git a/modules/military-generator.js b/modules/military-generator.js index a4b578e63..4dd19d3fc 100644 --- a/modules/military-generator.js +++ b/modules/military-generator.js @@ -7,7 +7,7 @@ let cells, p, states; const generate = function() { - console.time("generateMilitaryForces"); + TIME && console.time("generateMilitaryForces"); cells = pack.cells, p = cells.p, states = pack.states; const valid = states.filter(s => s.i && !s.removed); // valid states if (!options.military) options.military = getDefaultOptions(); @@ -176,7 +176,7 @@ return regiments; } - console.timeEnd("generateMilitaryForces"); + TIME && console.timeEnd("generateMilitaryForces"); } const getDefaultOptions = function() { diff --git a/modules/names-generator.js b/modules/names-generator.js index 987760110..32367be18 100644 --- a/modules/names-generator.js +++ b/modules/names-generator.js @@ -56,13 +56,13 @@ // generate name using Markov's chain const getBase = function(base, min, max, dupl) { - if (base === undefined) {console.error("Please define a base"); return;} + if (base === undefined) {ERROR && console.error("Please define a base"); return;} if (!chains[base]) updateChain(base); const data = chains[base]; if (!data || data[""] === undefined) { tip("Namesbase " + base + " is incorrect. Please check in namesbase editor", false, "error"); - console.error("Namebase " + base + " is incorrect!"); + ERROR && console.error("Namebase " + base + " is incorrect!"); return "ERROR"; } @@ -106,7 +106,7 @@ if (name.split(" ").some(part => part.length < 2)) name = name.split(" ").map((p,i) => i ? p.toLowerCase() : p).join(""); if (name.length < 2) { - console.error("Name is too short! Random name will be selected"); + ERROR && console.error("Name is too short! Random name will be selected"); name = ra(nameBases[base].b.split(",")); } @@ -115,14 +115,14 @@ // generate name for culture const getCulture = function(culture, min, max, dupl) { - if (culture === undefined) {console.error("Please define a culture"); return;} + if (culture === undefined) {ERROR && console.error("Please define a culture"); return;} const base = pack.cultures[culture].base; return getBase(base, min, max, dupl); } // generate short name for culture const getCultureShort = function(culture) { - if (culture === undefined) {console.error("Please define a culture"); return;} + if (culture === undefined) {ERROR && console.error("Please define a culture"); return;} return getBaseShort(pack.cultures[culture].base); } @@ -139,8 +139,8 @@ // generate state name based on capital or random name and culture-specific suffix const getState = function(name, culture, base) { - if (name === undefined) {console.error("Please define a base name"); return;} - if (culture === undefined && base === undefined) {console.error("Please define a culture"); return;} + if (name === undefined) {ERROR && console.error("Please define a base name"); return;} + if (culture === undefined && base === undefined) {ERROR && console.error("Please define a culture"); return;} if (base === undefined) base = pack.cultures[culture].base; // exclude endings inappropriate for states name diff --git a/modules/ocean-layers.js b/modules/ocean-layers.js index b5be82f47..a39bbdd71 100644 --- a/modules/ocean-layers.js +++ b/modules/ocean-layers.js @@ -9,7 +9,7 @@ const OceanLayers = function OceanLayers() { const outline = oceanLayers.attr("layers"); if (outline === "none") return; - console.time("drawOceanLayers"); + TIME && console.time("drawOceanLayers"); lineGen.curve(d3.curveBasisClosed); cells = grid.cells, pointsN = grid.cells.i.length, vertices = grid.vertices; @@ -51,7 +51,7 @@ return cells.v[i][cells.c[i].findIndex(c => cells.t[c] < t || !cells.t[c])]; } - console.timeEnd("drawOceanLayers"); + TIME && console.timeEnd("drawOceanLayers"); } function randomizeOutline() { @@ -89,7 +89,7 @@ if (v[0] !== undefined && v[0] !== prev && c0 !== c1) current = v[0]; else if (v[1] !== undefined && v[1] !== prev && c1 !== c2) current = v[1]; else if (v[2] !== undefined && v[2] !== prev && c0 !== c2) current = v[2]; - if (current === chain[chain.length - 1]) {console.error("Next vertex is not found"); break;} + if (current === chain[chain.length - 1]) {ERROR && console.error("Next vertex is not found"); break;} } chain.push(chain[0]); // push first vertex as the last one return chain; diff --git a/modules/relief-icons.js b/modules/relief-icons.js index 0d806e8bc..ab1916cea 100644 --- a/modules/relief-icons.js +++ b/modules/relief-icons.js @@ -5,7 +5,7 @@ }(this, (function () {'use strict'; const ReliefIcons = function() { - console.time('drawRelief'); + TIME && console.time('drawRelief'); terrain.selectAll("*").remove(); const density = terrain.attr("density") || .4; const size = 1.6 * (terrain.attr("size") || 1); @@ -69,7 +69,7 @@ terrain.html(reliefHTML); }() - console.timeEnd('drawRelief'); + TIME && console.timeEnd('drawRelief'); } function getBiomeIcon(i, b) { diff --git a/modules/religions-generator.js b/modules/religions-generator.js index 90ee88eea..1563f966a 100644 --- a/modules/religions-generator.js +++ b/modules/religions-generator.js @@ -54,7 +54,7 @@ }; const generate = function() { - console.time('generateReligions'); + TIME && console.time('generateReligions'); const cells = pack.cells, states = pack.states, cultures = pack.cultures; const religions = pack.religions = []; cells.religion = new Uint16Array(cells.culture); // cell religion; initially based on culture @@ -164,7 +164,7 @@ expandHeresies(); checkCenters(); - console.timeEnd('generateReligions'); + TIME && console.timeEnd('generateReligions'); } const add = function(center) { @@ -280,14 +280,14 @@ } function updateCultures() { - console.time('updateCulturesForReligions'); + TIME && console.time('updateCulturesForReligions'); pack.religions = pack.religions.map( (religion, index) => { if(index === 0) { return religion; } return {...religion, culture: pack.cells.culture[religion.center]}; }); - console.timeEnd('updateCulturesForReligions'); + TIME && console.timeEnd('updateCulturesForReligions'); } // assign a unique two-letters code (abbreviation) @@ -303,7 +303,7 @@ // get supreme deity name const getDeityName = function(culture) { - if (culture === undefined) {console.error("Please define a culture"); return;} + if (culture === undefined) {ERROR && console.error("Please define a culture"); return;} const meaning = generateMeaning(); const cultureName = Names.getCulture(culture, null, null, "", .8); return cultureName + ", The " + meaning; diff --git a/modules/river-generator.js b/modules/river-generator.js index 20ee34ba2..078392e13 100644 --- a/modules/river-generator.js +++ b/modules/river-generator.js @@ -5,7 +5,7 @@ }(this, (function () {'use strict'; const generate = function(changeHeights = true) { - console.time('generateRivers'); + TIME && console.time('generateRivers'); Math.seedrandom(seed); const cells = pack.cells, p = cells.p, features = pack.features; @@ -136,7 +136,7 @@ // apply change heights as basic one if (changeHeights) cells.h = Uint8Array.from(h); - console.timeEnd('generateRivers'); + TIME && console.timeEnd('generateRivers'); } // depression filling algorithm (for a correct water flux modeling) diff --git a/modules/routes-generator.js b/modules/routes-generator.js index af45dc4e6..d9d1905cc 100644 --- a/modules/routes-generator.js +++ b/modules/routes-generator.js @@ -5,7 +5,7 @@ }(this, (function () {'use strict'; const getRoads = function() { - console.time("generateMainRoads"); + TIME && console.time("generateMainRoads"); const cells = pack.cells, burgs = pack.burgs.filter(b => b.i && !b.removed); const capitals = burgs.filter(b => b.capital); if (capitals.length < 2) return []; // not enough capitals to build main roads @@ -21,12 +21,12 @@ } cells.i.forEach(i => cells.s[i] += cells.road[i] / 2); // add roads to suitability score - console.timeEnd("generateMainRoads"); + TIME && console.timeEnd("generateMainRoads"); return paths; } const getTrails = function() { - console.time("generateTrails"); + TIME && console.time("generateTrails"); const cells = pack.cells, burgs = pack.burgs.filter(b => b.i && !b.removed); if (burgs.length < 2) return []; // not enough burgs to build trails @@ -55,12 +55,12 @@ }); } - console.timeEnd("generateTrails"); + TIME && console.timeEnd("generateTrails"); return paths; } const getSearoutes = function() { - console.time("generateSearoutes"); + TIME && console.time("generateSearoutes"); const allPorts = pack.burgs.filter(b => b.port > 0 && !b.removed); if (allPorts.length < 2) return []; @@ -93,12 +93,12 @@ }); - console.timeEnd("generateSearoutes"); + TIME && console.timeEnd("generateSearoutes"); return paths; } const draw = function(main, small, ocean) { - console.time("drawRoutes"); + TIME && console.time("drawRoutes"); const cells = pack.cells, burgs = pack.burgs; lineGen.curve(d3.curveCatmullRom.alpha(0.1)); @@ -133,7 +133,7 @@ return [x, y]; })), 1)); - console.timeEnd("drawRoutes"); + TIME && console.timeEnd("drawRoutes"); } const regenerate = function() { diff --git a/modules/save-and-load.js b/modules/save-and-load.js index 6ad477016..7ee574a55 100644 --- a/modules/save-and-load.js +++ b/modules/save-and-load.js @@ -3,7 +3,7 @@ // download map as SVG async function saveSVG() { - console.time("saveSVG"); + TIME && console.time("saveSVG"); const url = await getMapURL("svg"); const link = document.createElement("a"); link.download = getFileName() + ".svg"; @@ -12,12 +12,12 @@ async function saveSVG() { link.click(); tip(`${link.download} is saved. Open "Downloads" screen (crtl + J) to check. You can set image scale in options`, true, "success", 5000); - console.timeEnd("saveSVG"); + TIME && console.timeEnd("saveSVG"); } // download map as PNG async function savePNG() { - console.time("savePNG"); + TIME && console.time("savePNG"); const url = await getMapURL("png"); const link = document.createElement("a"); @@ -43,12 +43,12 @@ async function savePNG() { }); } - console.timeEnd("savePNG"); + TIME && console.timeEnd("savePNG"); } // download map as JPEG async function saveJPEG() { - console.time("saveJPEG"); + TIME && console.time("saveJPEG"); const url = await getMapURL("png"); const canvas = document.createElement("canvas"); @@ -70,7 +70,7 @@ async function saveJPEG() { window.setTimeout(() => window.URL.revokeObjectURL(URL), 5000); } - console.timeEnd("saveJPEG"); + TIME && console.timeEnd("saveJPEG"); } // parse map svg to object url @@ -228,7 +228,7 @@ function GFontToDataURI(url) { // prepare map data for saving function getMapData() { - console.time("createMapDataBlob"); + TIME && console.time("createMapDataBlob"); return new Promise(resolve => { const date = new Date(); @@ -283,7 +283,7 @@ function getMapData() { namesData, rivers].join("\r\n"); const blob = new Blob([data], {type: "text/plain"}); - console.timeEnd("createMapDataBlob"); + TIME && console.timeEnd("createMapDataBlob"); resolve(blob); }); @@ -448,7 +448,7 @@ function quickLoad() { loadMapPrompt(blob); } else { tip("No map stored. Save map to storage first", true, "error", 2000); - console.error("No map stored"); + ERROR && console.error("No map stored"); } }); } @@ -467,12 +467,12 @@ function loadMapPrompt(blob) { }); function loadLastSavedMap() { - console.warn("Load last saved map"); + WARN && console.warn("Load last saved map"); try { uploadMap(blob); } catch(error) { - console.error(error); + ERROR && console.error(error); tip("Cannot load last saved map", true, "error", 2000); } } @@ -564,7 +564,7 @@ function parseLoadedData(data) { mapId = params[6] ? +params[6] : Date.now(); }() - console.group("Loaded Map " + seed); + INFO && console.group("Loaded Map " + seed); void function parseSettings() { const settings = data[1].split("|"); @@ -1006,49 +1006,49 @@ function parseLoadedData(data) { invalidStates.forEach(s => { const invalidCells = cells.i.filter(i => cells.state[i] === s); invalidCells.forEach(i => cells.state[i] = 0); - console.error("Data Integrity Check. Invalid state", s, "is assigned to cells", invalidCells); + ERROR && console.error("Data Integrity Check. Invalid state", s, "is assigned to cells", invalidCells); }); const invalidProvinces = [...new Set(cells.province)].filter(p => p && (!pack.provinces[p] || pack.provinces[p].removed)); invalidProvinces.forEach(p => { const invalidCells = cells.i.filter(i => cells.province[i] === p); invalidCells.forEach(i => cells.province[i] = 0); - console.error("Data Integrity Check. Invalid province", p, "is assigned to cells", invalidCells); + ERROR && console.error("Data Integrity Check. Invalid province", p, "is assigned to cells", invalidCells); }); const invalidCultures = [...new Set(cells.culture)].filter(c => !pack.cultures[c] || pack.cultures[c].removed); invalidCultures.forEach(c => { const invalidCells = cells.i.filter(i => cells.culture[i] === c); invalidCells.forEach(i => cells.province[i] = 0); - console.error("Data Integrity Check. Invalid culture", c, "is assigned to cells", invalidCells); + ERROR && console.error("Data Integrity Check. Invalid culture", c, "is assigned to cells", invalidCells); }); const invalidReligions = [...new Set(cells.religion)].filter(r => !pack.religions[r] || pack.religions[r].removed); invalidReligions.forEach(r => { const invalidCells = cells.i.filter(i => cells.religion[i] === r); invalidCells.forEach(i => cells.religion[i] = 0); - console.error("Data Integrity Check. Invalid religion", c, "is assigned to cells", invalidCells); + ERROR && console.error("Data Integrity Check. Invalid religion", c, "is assigned to cells", invalidCells); }); const invalidFeatures = [...new Set(cells.f)].filter(f => f && !pack.features[f]); invalidFeatures.forEach(f => { const invalidCells = cells.i.filter(i => cells.f[i] === f); // No fix as for now - console.error("Data Integrity Check. Invalid feature", f, "is assigned to cells", invalidCells); + ERROR && console.error("Data Integrity Check. Invalid feature", f, "is assigned to cells", invalidCells); }); const invalidBurgs = [...new Set(cells.burg)].filter(b => b && (!pack.burgs[b] || pack.burgs[b].removed)); invalidBurgs.forEach(b => { const invalidCells = cells.i.filter(i => cells.burg[i] === b); invalidCells.forEach(i => cells.burg[i] = 0); - console.error("Data Integrity Check. Invalid burg", b, "is assigned to cells", invalidCells); + ERROR && console.error("Data Integrity Check. Invalid burg", b, "is assigned to cells", invalidCells); }); pack.burgs.forEach(b => { if (!b.i || b.removed) return; - if (b.port < 0) {console.error("Data Integrity Check. Burg", b.i, "has invalid port value", b.port); b.port = 0;} + if (b.port < 0) {ERROR && console.error("Data Integrity Check. Burg", b.i, "has invalid port value", b.port); b.port = 0;} if (b.cell < cells.i.length) return; - console.error("Data Integrity Check. Burg", b.i, "is linked to invalid cell", b.cell); + ERROR && console.error("Data Integrity Check. Burg", b.i, "is linked to invalid cell", b.cell); b.cell = findCell(b.x, b.y); cells.i.filter(i => cells.burg[i] === b.i).forEach(i => cells.burg[i] = 0); cells.burg[b.cell] = b.i; @@ -1065,13 +1065,13 @@ function parseLoadedData(data) { focusOn(); // based on searchParams focus on point, cell or burg invokeActiveZooming(); - console.warn(`TOTAL: ${rn((performance.now()-uploadMap.timeStart)/1000,2)}s`); + WARN && console.warn(`TOTAL: ${rn((performance.now()-uploadMap.timeStart)/1000,2)}s`); showStatistics(); - console.groupEnd("Loaded Map " + seed); + INFO && console.groupEnd("Loaded Map " + seed); tip("Map is successfully loaded", true, "success", 7000); } catch(error) { - console.error(error); + ERROR && console.error(error); clearMainTip(); alertMessage.innerHTML = `An error is occured on map loading. Select a different file to load, diff --git a/modules/ui/burg-editor.js b/modules/ui/burg-editor.js index b129df881..0691fa3ef 100644 --- a/modules/ui/burg-editor.js +++ b/modules/ui/burg-editor.js @@ -141,7 +141,7 @@ function editBurg(id) { const label = document.querySelector("#burgLabels [data-id='" + id + "']"); const icon = document.querySelector("#burgIcons [data-id='" + id + "']"); const anchor = document.querySelector("#anchors [data-id='" + id + "']"); - if (!label || !icon) {console.error("Cannot find label or icon elements"); return;} + if (!label || !icon) {ERROR && console.error("Cannot find label or icon elements"); return;} const labelG = document.querySelector("#burgLabels > #"+oldGroup); const iconG = document.querySelector("#burgIcons > #"+oldGroup); diff --git a/modules/ui/editors.js b/modules/ui/editors.js index fba985602..a67873ffc 100644 --- a/modules/ui/editors.js +++ b/modules/ui/editors.js @@ -141,7 +141,7 @@ function moveBurgToGroup(id, g) { const label = document.querySelector("#burgLabels [data-id='" + id + "']"); const icon = document.querySelector("#burgIcons [data-id='" + id + "']"); const anchor = document.querySelector("#anchors [data-id='" + id + "']"); - if (!label || !icon) {console.error("Cannot find label or icon elements"); return;} + if (!label || !icon) {ERROR && console.error("Cannot find label or icon elements"); return;} document.querySelector("#burgLabels > #"+g).appendChild(label); document.querySelector("#burgIcons > #"+g).appendChild(icon); @@ -639,7 +639,7 @@ function selectIcon(initial, callback) { // Calls the refresh functionality on all editors currently open. function refreshAllEditors() { - console.time('refreshAllEditors'); + TIME && console.time('refreshAllEditors'); if (document.getElementById('culturesEditorRefresh').offsetParent) culturesEditorRefresh.click(); if (document.getElementById('biomesEditorRefresh').offsetParent) biomesEditorRefresh.click(); if (document.getElementById('diplomacyEditorRefresh').offsetParent) diplomacyEditorRefresh.click(); @@ -647,5 +647,5 @@ function refreshAllEditors() { if (document.getElementById('religionsEditorRefresh').offsetParent) religionsEditorRefresh.click(); if (document.getElementById('statesEditorRefresh').offsetParent) statesEditorRefresh.click(); if (document.getElementById('zonesEditorRefresh').offsetParent) zonesEditorRefresh.click(); - console.timeEnd('refreshAllEditors'); + TIME && console.timeEnd('refreshAllEditors'); } diff --git a/modules/ui/heightmap-editor.js b/modules/ui/heightmap-editor.js index f574f84eb..66fba6568 100644 --- a/modules/ui/heightmap-editor.js +++ b/modules/ui/heightmap-editor.js @@ -164,8 +164,8 @@ function editHeightmap() { } function regenerateErasedData() { - console.group("Edit Heightmap"); - console.time("regenerateErasedData"); + INFO && console.group("Edit Heightmap"); + TIME && console.time("regenerateErasedData"); const change = changeHeights.checked; markFeatures(); @@ -204,8 +204,8 @@ function editHeightmap() { Military.generate(); addMarkers(); addZones(); - console.timeEnd("regenerateErasedData"); - console.groupEnd("Edit Heightmap"); + TIME && console.timeEnd("regenerateErasedData"); + INFO && console.groupEnd("Edit Heightmap"); } function restoreKeptData() { @@ -216,8 +216,8 @@ function editHeightmap() { } function restoreRiskedData() { - console.group("Edit Heightmap"); - console.time("restoreRiskedData"); + INFO && console.group("Edit Heightmap"); + TIME && console.time("restoreRiskedData"); // assign pack data to grid cells const l = grid.cells.i.length; @@ -401,8 +401,8 @@ function editHeightmap() { .attr("points", d => getPackPolygon(d)).attr("id", d => base + d); }); - console.timeEnd("restoreRiskedData"); - console.groupEnd("Edit Heightmap"); + TIME && console.timeEnd("restoreRiskedData"); + INFO && console.groupEnd("Edit Heightmap"); } // trigger heightmap redraw and history update if at least 1 cell is changed @@ -954,7 +954,7 @@ function editHeightmap() { templateBody.innerHTML = ""; for (const s of steps) { const step = s.split(" "); - if (step.length !== 5) {console.error("Cannot parse step, wrong arguments count", s); continue;} + if (step.length !== 5) {ERROR && console.error("Cannot parse step, wrong arguments count", s); continue;} addStep(step[0], step[1], step[2], step[3], step[4]); } diff --git a/modules/ui/layers.js b/modules/ui/layers.js index b834c9d2a..4ab033650 100644 --- a/modules/ui/layers.js +++ b/modules/ui/layers.js @@ -131,7 +131,7 @@ function toggleHeight(event) { } function drawHeightmap() { - console.time("drawHeightmap"); + TIME && console.time("drawHeightmap"); terrs.selectAll("*").remove(); const cells = pack.cells, vertices = pack.vertices, n = cells.i.length; const used = new Uint8Array(cells.i.length); @@ -188,7 +188,7 @@ function drawHeightmap() { if (v[0] !== prev && c0 !== c1) current = v[0]; else if (v[1] !== prev && c1 !== c2) current = v[1]; else if (v[2] !== prev && c0 !== c2) current = v[2]; - if (current === chain[chain.length - 1]) {console.error("Next vertex is not found"); break;} + if (current === chain[chain.length - 1]) {ERROR && console.error("Next vertex is not found"); break;} } return chain; } @@ -199,7 +199,7 @@ function drawHeightmap() { return chain.filter((d, i) => i % n === 0); } - console.timeEnd("drawHeightmap"); + TIME && console.timeEnd("drawHeightmap"); } function getColorScheme() { @@ -228,7 +228,7 @@ function toggleTemp(event) { } function drawTemp() { - console.time("drawTemp"); + TIME && console.time("drawTemp"); temperature.selectAll("*").remove(); lineGen.curve(d3.curveBasisClosed); const scheme = d3.scaleSequential(d3.interpolateSpectral); @@ -311,12 +311,12 @@ function drawTemp() { if (v[0] !== prev && c0 !== c1) current = v[0]; else if (v[1] !== prev && c1 !== c2) current = v[1]; else if (v[2] !== prev && c0 !== c2) current = v[2]; - if (current === chain[chain.length - 1]) {console.error("Next vertex is not found"); break;} + if (current === chain[chain.length - 1]) {ERROR && console.error("Next vertex is not found"); break;} } chain.push(start); return chain; } - console.timeEnd("drawTemp"); + TIME && console.timeEnd("drawTemp"); } function toggleBiomes(event) { @@ -370,7 +370,7 @@ function drawBiomes() { if (v[0] !== prev && c0 !== c1) current = v[0]; else if (v[1] !== prev && c1 !== c2) current = v[1]; else if (v[2] !== prev && c0 !== c2) current = v[2]; - if (current === chain[chain.length - 1]) {console.error("Next vertex is not found"); break;} + if (current === chain[chain.length - 1]) {ERROR && console.error("Next vertex is not found"); break;} } return chain; } @@ -526,7 +526,7 @@ function drawIce() { if (v[0] !== prev && c0 !== c1) current = v[0]; else if (v[1] !== prev && c1 !== c2) current = v[1]; else if (v[2] !== prev && c0 !== c2) current = v[2]; - if (current === chain[chain.length - 1]) {console.error("Next vertex is not found"); break;} + if (current === chain[chain.length - 1]) {ERROR && console.error("Next vertex is not found"); break;} } return chain; } @@ -547,7 +547,7 @@ function toggleCultures(event) { } function drawCultures() { - console.time("drawCultures"); + TIME && console.time("drawCultures"); cults.selectAll("path").remove(); const cells = pack.cells, vertices = pack.vertices, cultures = pack.cultures, n = cells.i.length; @@ -586,11 +586,11 @@ function drawCultures() { if (v[0] !== prev && c0 !== c1) current = v[0]; else if (v[1] !== prev && c1 !== c2) current = v[1]; else if (v[2] !== prev && c0 !== c2) current = v[2]; - if (current === chain[chain.length - 1]) {console.error("Next vertex is not found"); break;} + if (current === chain[chain.length - 1]) {ERROR && console.error("Next vertex is not found"); break;} } return chain; } - console.timeEnd("drawCultures"); + TIME && console.timeEnd("drawCultures"); } function toggleReligions(event) { @@ -607,7 +607,7 @@ function toggleReligions(event) { } function drawReligions() { - console.time("drawReligions"); + TIME && console.time("drawReligions"); relig.selectAll("path").remove(); const cells = pack.cells, vertices = pack.vertices, religions = pack.religions, features = pack.features, n = cells.i.length; @@ -657,12 +657,12 @@ function drawReligions() { if (v[0] !== prev && c0 !== c1) {current = v[0]; check(c0 ? c[0] : c[1]);} else if (v[1] !== prev && c1 !== c2) {current = v[1]; check(c1 ? c[1] : c[2]);} else if (v[2] !== prev && c0 !== c2) {current = v[2]; check(c2 ? c[2] : c[0]);} - if (current === chain[chain.length - 1][0]) {console.error("Next vertex is not found"); break;} + if (current === chain[chain.length - 1][0]) {ERROR && console.error("Next vertex is not found"); break;} } return chain; } - console.timeEnd("drawReligions"); + TIME && console.timeEnd("drawReligions"); } function toggleStates(event) { @@ -680,7 +680,7 @@ function toggleStates(event) { // draw states function drawStates() { - console.time("drawStates"); + TIME && console.time("drawStates"); regions.selectAll("path").remove(); const cells = pack.cells, vertices = pack.vertices, states = pack.states, n = cells.i.length; @@ -741,18 +741,18 @@ function drawStates() { if (v[0] !== prev && c0 !== c1) {current = v[0]; check(c0 ? c[0] : c[1]);} else if (v[1] !== prev && c1 !== c2) {current = v[1]; check(c1 ? c[1] : c[2]);} else if (v[2] !== prev && c0 !== c2) {current = v[2]; check(c2 ? c[2] : c[0]);} - if (current === chain[chain.length - 1][0]) {console.error("Next vertex is not found"); break;} + if (current === chain[chain.length - 1][0]) {ERROR && console.error("Next vertex is not found"); break;} } chain.push([start, state, land]); // add starting vertex to sequence to close the path return chain; } invokeActiveZooming(); - console.timeEnd("drawStates"); + TIME && console.timeEnd("drawStates"); } // draw state and province borders function drawBorders() { - console.time("drawBorders"); + TIME && console.time("drawBorders"); borders.selectAll("path").remove(); const cells = pack.cells, vertices = pack.vertices, n = cells.i.length; @@ -807,7 +807,7 @@ function drawBorders() { // find starting vertex for (let i=0; i < 1000; i++) { - if (i === 999) console.error("Find starting vertex: limit is reached", current, f, t); + if (i === 999) ERROR && console.error("Find starting vertex: limit is reached", current, f, t); const p = chain[chain.length-2] || -1; // previous vertex const v = vertices.v[current], c = vertices.c[current]; @@ -825,7 +825,7 @@ function drawBorders() { chain = [current]; // vertices chain to form a path // find path for (let i=0; i < 1000; i++) { - if (i === 999) console.error("Find path: limit is reached", current, f, t); + if (i === 999) ERROR && console.error("Find path: limit is reached", current, f, t); const p = chain[chain.length-2] || -1; // previous vertex const v = vertices.v[current], c = vertices.c[current]; c.filter(c => array[c] === t).forEach(c => used[f][c] = t); @@ -845,7 +845,7 @@ function drawBorders() { return chain; } - console.timeEnd("drawBorders"); + TIME && console.timeEnd("drawBorders"); } function toggleBorders(event) { @@ -873,7 +873,7 @@ function toggleProvinces(event) { } function drawProvinces() { - console.time("drawProvinces"); + TIME && console.time("drawProvinces"); const labelsOn = provs.attr("data-labels") == 1; provs.selectAll("*").remove(); @@ -937,12 +937,12 @@ function drawProvinces() { if (v[0] !== prev && c0 !== c1) {current = v[0]; check(c0 ? c[0] : c[1]);} else if (v[1] !== prev && c1 !== c2) {current = v[1]; check(c1 ? c[1] : c[2]);} else if (v[2] !== prev && c0 !== c2) {current = v[2]; check(c2 ? c[2] : c[0]);} - if (current === chain[chain.length-1][0]) {console.error("Next vertex is not found"); break;} + if (current === chain[chain.length-1][0]) {ERROR && console.error("Next vertex is not found"); break;} } chain.push([start, province, land]); // add starting vertex to sequence to close the path return chain; } - console.timeEnd("drawProvinces"); + TIME && console.timeEnd("drawProvinces"); } function toggleGrid(event) { @@ -959,7 +959,7 @@ function toggleGrid(event) { } function drawGrid() { - console.time("drawGrid"); + TIME && console.time("drawGrid"); gridOverlay.selectAll("*").remove(); const type = styleGridType.value; const size = Math.max(+styleGridSize.value, 2); @@ -1003,7 +1003,7 @@ function drawGrid() { }); } - console.timeEnd("drawGrid"); + TIME && console.timeEnd("drawGrid"); } function toggleCoordinates(event) { diff --git a/modules/ui/style.js b/modules/ui/style.js index f715a8849..e02393a7a 100644 --- a/modules/ui/style.js +++ b/modules/ui/style.js @@ -653,7 +653,7 @@ function setBase64Texture(url) { }; function fetchTextureURL(url) { - console.log("Provided URL is", url); + INFO && console.log("Provided URL is", url); const img = new Image(); img.onload = function () { const canvas = document.getElementById("texturePreview"); diff --git a/modules/utils.js b/modules/utils.js index 31cd30934..352c7b594 100644 --- a/modules/utils.js +++ b/modules/utils.js @@ -471,14 +471,14 @@ function lim(v) { // get number from string in format "1-3" or "2" or "0.5" function getNumberInRange(r) { - if (typeof r !== "string") {console.error("The value should be a string", r); return 0;} + if (typeof r !== "string") {ERROR && console.error("The value should be a string", r); return 0;} if (!isNaN(+r)) return ~~r + +P(r - ~~r); const sign = r[0] === "-" ? -1 : 1; if (isNaN(+r[0])) r = r.slice(1); const range = r.includes("-") ? r.split("-") : null; - if (!range) {console.error("Cannot parse the number. Check the format", r); return 0;} + if (!range) {ERROR && console.error("Cannot parse the number. Check the format", r); return 0;} const count = rand(range[0] * sign, +range[1]); - if (isNaN(count) || count < 0) {console.error("Cannot parse number. Check the format", r); return 0;} + if (isNaN(count) || count < 0) {ERROR && console.error("Cannot parse number. Check the format", r); return 0;} return count; } @@ -603,7 +603,7 @@ void function() { const form = prompt.querySelector("#promptForm"); window.prompt = function(promptText = "Please provide an input", options = {default:1, step:.01, min:0, max:100}, callback) { - if (options.default === undefined) {console.error("Prompt: options object does not have default value defined"); return;} + if (options.default === undefined) {ERROR && console.error("Prompt: options object does not have default value defined"); return;} const input = prompt.querySelector("#promptInput"); prompt.querySelector("#promptText").innerHTML = promptText; const type = typeof(options.default) === "number" ? "number" : "text"; @@ -628,4 +628,4 @@ void function() { }() // indexedDB; ldb object -!function(){function e(t,o){return n?void(n.transaction("s").objectStore("s").get(t).onsuccess=function(e){var t=e.target.result&&e.target.result.v||null;o(t)}):void setTimeout(function(){e(t,o)},100)}var t=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;if(!t)return void console.error("indexedDB not supported");var n,o={k:"",v:""},r=t.open("d2",1);r.onsuccess=function(e){n=this.result},r.onerror=function(e){console.error("indexedDB request error"),console.log(e)},r.onupgradeneeded=function(e){n=null;var t=e.target.result.createObjectStore("s",{keyPath:"k"});t.transaction.oncomplete=function(e){n=e.target.db}},window.ldb={get:e,set:function(e,t){o.k=e,o.v=t,n.transaction("s","readwrite").objectStore("s").put(o)}}}(); \ No newline at end of file +!function(){function e(t,o){return n?void(n.transaction("s").objectStore("s").get(t).onsuccess=function(e){var t=e.target.result&&e.target.result.v||null;o(t)}):void setTimeout(function(){e(t,o)},100)}var t=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;if(!t)return void ERROR && console.error("indexedDB not supported");var n,o={k:"",v:""},r=t.open("d2",1);r.onsuccess=function(e){n=this.result},r.onerror=function(e){ERROR && console.error("indexedDB request error"),INFO && console.log(e)},r.onupgradeneeded=function(e){n=null;var t=e.target.result.createObjectStore("s",{keyPath:"k"});t.transaction.oncomplete=function(e){n=e.target.db}},window.ldb={get:e,set:function(e,t){o.k=e,o.v=t,n.transaction("s","readwrite").objectStore("s").put(o)}}}(); \ No newline at end of file