This commit is contained in:
Azgaar 2019-06-09 22:00:55 +03:00
parent c22d0d755a
commit 436172ee2f
6 changed files with 420 additions and 129 deletions

View file

@ -34,15 +34,15 @@
for (const [cx, cy] of poissonDiscSampler(e[0], e[1], e[2], e[3], radius)) {
if (!d3.polygonContains(polygon, [cx, cy])) continue;
let h = rn((4 + Math.random()) * size, 2);
const icon = getBiomeIcon(biomesData.icons[b]);
const icon = getBiomeIcon(i, biomesData.icons[b]);
if (icon === "#relief-grass-1") h *= 1.3;
relief.push({t: icon, c: i, x: rn(cx-h, 2), y: rn(cy-h, 2), s: h*2});
}
}
function placeReliefIcons() {
function placeReliefIcons(i) {
const radius = 2 / density;
const [icon, h] = getReliefIcon(height);
const [icon, h] = getReliefIcon(i, height);
for (const [cx, cy] of poissonDiscSampler(e[0], e[1], e[2], e[3], radius)) {
if (!d3.polygonContains(polygon, [cx, cy])) continue;
@ -50,10 +50,11 @@
}
}
function getReliefIcon(h) {
const type = h > 70 ? "mount" : "hill";
function getReliefIcon(i, h) {
const temp = grid.cells.temp[pack.cells.g[i]];
const type = h > 70 && temp < 0 ? "mountSnow" : h > 70 ? "mount" : "hill";
const size = h > 70 ? (h - 45) * mod : Math.min(Math.max((h - 40) * mod, 3), 6);
return ["#relief-" + type + "-1", size];
return ["#relief-" + type + "-" + getIcon(type), size];
}
}
@ -71,8 +72,25 @@
console.timeEnd('drawRelief');
}
function getBiomeIcon(i) {
return "#relief-" + i[Math.floor(Math.random() * i.length)] + "-1";
function getBiomeIcon(i, b) {
let type = b[Math.floor(Math.random() * b.length)];
const temp = grid.cells.temp[pack.cells.g[i]];
if (type === "conifer" && temp < 0) type = "coniferSnow";
return "#relief-" + type + "-" + getIcon(type);
}
function getIcon(type) {
switch (type) {
case "mount": return rand(2,7);
case "mountSnow": return rand(1,6);
case "hill": return rand(2,5);
case "conifer": return 2;
case "coniferSnow": return 1;
case "swamp": return rand(2,3);
case "cactus": return rand(1,3);
case "deadTree": return rand(1,2);
default: return 2;
}
}
return ReliefIcons;

View file

@ -217,6 +217,7 @@ function uploadFile(file, callback) {
function parseLoadedData(data) {
closeDialogs();
const reliefIcons = document.getElementById("defs-relief").innerHTML; // save relief icons
void function parseParameters() {
const params = data[0].split("|");
@ -385,8 +386,14 @@ function parseLoadedData(data) {
}()
void function resolveVersionConflicts() {
document.getElementById("regions").removeAttribute("opacity"); // 0.8.28b changed opacity slider from regions to statesBody
}
if (parseFloat(data[0].split("|")[0]) == 0.8) {
// 0.9 has additional relief icons to be included into older maps
document.getElementById("defs-relief").innerHTML = reliefIcons;
// 0.8.28b changed opacity slider from regions to statesBody
document.getElementById("regions").removeAttribute("opacity");
}
}()
changeMapSize();
restoreDefaultEvents();

View file

@ -5,7 +5,7 @@ function editReliefIcon() {
if (!layerIsOn("toggleRelief")) toggleRelief();
terrain.selectAll("use").call(d3.drag().on("drag", dragReliefIcon)).classed("draggable", true);
elSelected = d3.select(d3.event.target);
elSelected = d3.select(d3.event.target);
restoreEditMode();
updateReliefIconSelected();
@ -27,7 +27,7 @@ function editReliefIcon() {
document.getElementById("reliefSize").addEventListener("input", changeIconSize);
document.getElementById("reliefSizeNumber").addEventListener("input", changeIconSize);
reliefIconsDiv.querySelectorAll("button").forEach(el => el.addEventListener("click", changeIcon));
reliefIconsDiv.querySelectorAll("svg").forEach(el => el.addEventListener("click", changeIcon));
document.getElementById("reliefCopy").addEventListener("click", copyIcon);
document.getElementById("reliefMoveFront").addEventListener("click", () => elSelected.raise());
@ -53,8 +53,8 @@ function editReliefIcon() {
function updateReliefIconSelected() {
const type = elSelected.attr("data-type");
reliefIconsDiv.querySelectorAll("button.pressed").forEach(b => b.classList.remove("pressed"));
reliefIconsDiv.querySelector("button[data-type='"+type+"']").classList.add("pressed");
reliefIconsDiv.querySelectorAll("svg.pressed").forEach(b => b.classList.remove("pressed"));
reliefIconsDiv.querySelector("svg[data-type='"+type+"']").classList.add("pressed");
}
function updateReliefSizeInput() {
@ -85,10 +85,10 @@ function editReliefIcon() {
reliefSpacingDiv.style.display = "block";
reliefIconsSeletionAny.style.display = "none";
const pressedType = reliefIconsDiv.querySelector("button.pressed");
const pressedType = reliefIconsDiv.querySelector("svg.pressed");
if (pressedType.id === "reliefIconsSeletionAny") { // in "any" is pressed, select first type
reliefIconsSeletionAny.classList.remove("pressed");
reliefIconsDiv.querySelector("button").classList.add("pressed");
reliefIconsSeletionAny.classList.remove("pressed");
reliefIconsDiv.querySelector("svg").classList.add("pressed");
}
viewbox.style("cursor", "crosshair").call(d3.drag().on("start", dragToAdd)).on("touchmove mousemove", moveBrush);
@ -98,18 +98,18 @@ function editReliefIcon() {
function moveBrush() {
showMainTip();
const point = d3.mouse(this);
const radius = +reliefRadius.value;
const radius = +reliefRadiusNumber.value;
moveCircle(point[0], point[1], radius);
}
function dragToAdd() {
const pressed = reliefIconsDiv.querySelector("button.pressed");
const pressed = reliefIconsDiv.querySelector("svg.pressed");
if (!pressed) {tip("Please select an icon", false, error); return;}
const type = pressed.dataset.type;
const r = +reliefRadius.value;
const spacing = +reliefSpacing.value;
const size = +reliefSize.value;
const r = +reliefRadiusNumber.value;
const spacing = +reliefSpacingNumber.value;
const size = +reliefSizeNumber.value;
// build a quadtree
const tree = d3.quadtree();
@ -166,10 +166,10 @@ function editReliefIcon() {
}
function dragToRemove() {
const pressed = reliefIconsDiv.querySelector("button.pressed");
const pressed = reliefIconsDiv.querySelector("svg.pressed");
if (!pressed) {tip("Please select an icon", false, error); return;}
const r = +reliefRadius.value;
const r = +reliefRadiusNumber.value;
const type = pressed.dataset.type;
const icons = type ? terrain.selectAll("use[data-type='"+type+"']") : terrain.selectAll("use");
const tree = d3.quadtree();
@ -187,8 +187,7 @@ function editReliefIcon() {
}
function changeIconSize() {
const size = +reliefSize.value;
reliefSize.value = reliefSizeNumber.value = size;
const size = +reliefSizeNumber.value;
if (!reliefIndividual.classList.contains("pressed")) return;
const shift = (size - +elSelected.attr("width")) / 2;
@ -200,7 +199,7 @@ function editReliefIcon() {
function changeIcon() {
if (this.classList.contains("pressed")) return;
reliefIconsDiv.querySelectorAll("button.pressed").forEach(b => b.classList.remove("pressed"))
reliefIconsDiv.querySelectorAll("svg.pressed").forEach(b => b.classList.remove("pressed"))
this.classList.add("pressed");
if (reliefIndividual.classList.contains("pressed")) {