biome_map = {
const context = DOM.context2d(width, height);
context.clearRect(0, 0, width, height);
console.log("seed:", geometry.next_seed);
let rng = d3.randomLcg(geometry.next_seed);
let voronoi = geometry.voronoi;
let minty = ["#1B4E3B","#267055","#3EB489","#32926F","#65B172","#84AD5F","#9FA752"]
let chocolate = ["#E4D4C8","#D0B49F","#A47551","#523A28"]
let dark_minty = ["#1B4E3B","#267055","#3EB489","#32926F"]
let light_minty = ["#32926F","#65B172","#84AD5F","#9FA752"]
let colors = d3.schemeSpectral[11];
let scale = d3.scaleSequential()
.domain([0, 1.0])
.interpolator(d3.interpolateWarm);
let peaks = [];
let underwater = [];
let tri_colors = [];
let on_border = [];
let all_seas = [];
let north_sea = [];
let east_sea = [];
let south_sea = [];
let west_sea = [];
let all_edge = [];
let north_edge = [];
let east_edge = [];
let south_edge = [];
let west_edge = [];
let all_corners = [];
let ne_corner = [];
let se_corner = [];
let sw_corner = [];
let nw_corner = [];
let interior = [];
for (let i = 0; i < geometry.n_cells; i++) {
let comb_value = geometry.noise_values[i];
on_border[i] = false;
let edges = Array.from(pairwise(geometry.voronoi.cellPolygon(i)));
for (const edge of edges) {
if (edge[0][0] === 0.0 && edge[1][0] === 0.0) {
all_seas.push(i);
west_sea.push(i);
on_border[i] = true;
tri_colors[i] = d3.interpolateBlues(d3.randomUniform.source(rng)(0.5,1.0)());
} else if (edge[0][1] === 0.0 && edge[1][1] === 0.0) {
all_seas.push(i);
north_sea.push(i);
on_border[i] = true;
tri_colors[i] = d3.interpolateBlues(d3.randomUniform.source(rng)(0.5,1.0)());
} else if (edge[0][0] === width && edge[1][0] === width) {
all_seas.push(i);
east_sea.push(i);
on_border[i] = true;
tri_colors[i] = d3.interpolateBlues(d3.randomUniform.source(rng)(0.5,1.0)());
} else if (edge[0][1] === height && edge[1][1] == height) {
all_seas.push(i);
south_sea.push(i);
on_border[i] = true;
tri_colors[i] = d3.interpolateBlues(d3.randomUniform.source(rng)(0.5,1.0)());
}
}
}
all_seas = _.uniq(all_seas);
west_sea = _.uniq(west_sea);
north_sea = _.uniq(north_sea);
east_sea = _.uniq(east_sea);
south_sea = _.uniq(south_sea);
let all_coasts = [];
let west_coast = [];
let north_coast = [];
let east_coast = [];
let south_coast = [];
let corners = [];
for (let i of all_seas) {
for (let j of geometry.voronoi.neighbors(i)) {
if (!all_seas.includes(j)) {
all_coasts.push(j);
if (west_sea.includes(i)) {
console.log("west coast: ",j);
west_coast.push(j);
tri_colors[j] = "red";
} else if (north_sea.includes(i)) {
console.log("north coast: ",j);
north_coast.push(j);
tri_colors[j] = "orange";
} else if (east_sea.includes(i)) {
console.log("east coast: ",j);
east_coast.push(j);
tri_colors[j] = "yellow";
} else if (south_sea.includes(i)) {
console.log("south coast: ",j);
south_coast.push(j);
tri_colors[j] = "magenta";
}
}
}
}
for (let i of all_coasts) {
if (west_coast.includes(i)) {
if (north_coast.includes(i)) {
corners.push(i);
} else if (south_coast.includes(i)) {
corners.push(i)
}
} else if (east_coast.includes(i)) {
if (north_coast.includes(i)) {
corners.push(i);
} else if (south_coast.includes(i)) {
corners.push(i)
}
}
}
for (let i of corners) {
tri_colors[i] = "violet";
}
let sea_options = [west_sea, north_sea, east_sea, south_sea];
let coast_options = [west_coast, north_coast, east_coast, south_coast];
let opposite_options = [east_coast, south_coast, west_coast, north_coast];
let remaining_coasts = [[north_coast, south_coast], [east_coast, west_coast], [north_coast, south_coast], [east_coast, west_coast]];
let selection = d3.randomInt.source(rng)(0,4)();
let select_sea = sea_options[selection];
let select_coast = coast_options[selection];
let select_opposite = opposite_options[selection];
let remaining_selection = d3.randomInt.source(rng)(0,1)();
let last_selection = remaining_selection == 0 ? 1 : 0;
let select_remaining = remaining_coasts[selection];
console.log("remaining coasts", remaining_coasts, "remaining_selection", remaining_selection, "last_selection", last_selection,"select_remaining", select_remaining)
let far_coast = select_remaining[remaining_selection];
let near_coast = select_remaining[last_selection];
for (let i of select_sea) {
tri_colors[i] = chocolate[d3.randomInt.source(rng)(0,4)()];
}
for (let i of select_coast) {
tri_colors[i] = d3.interpolateYlOrBr(d3.randomUniform.source(rng)()());
}
for (let i of select_opposite) {
tri_colors[i] = d3.interpolateGnBu(d3.randomUniform.source(rng)()());
}
for (let i of far_coast) {
tri_colors[i] = dark_minty[d3.randomInt.source(rng)(0,4)()];
}
for (let i of near_coast) {
tri_colors[i] = light_minty[d3.randomInt.source(rng)(0,4)()];
}
for (let i = 0; i < geometry.n_cells; i++) {
if (!all_seas.includes(i) && !all_coasts.includes(i)) {
interior.push(i);
tri_colors[i] = light_minty[d3.randomInt.source(rng)(0,4)()];
}
}
for (let x = 0; x < width; x+= 8) {
for (let y = 0; y < height; y += 8) {
let noise_x = perlin2(x / 20, y / 20);
let noise_y = perlin2((x+3700) / 20, (y+2900) / 20);
let nearest = geometry.delaunay.find(x + noise_x * 20, y + noise_y * 20);
let tile_color = tri_colors[nearest];
context.fillStyle = tile_color;
context.beginPath();
context.moveTo( x - 4, y - 4);
context.lineTo( x + 4, y - 4);
context.lineTo( x + 4, y + 4);
context.lineTo( x - 4, y + 4);
context.lineTo( x - 4, y - 4);
context.fill()
}
}
return context.canvas;
}