diff --git a/base.png b/base.png
index b6c48b8..c2d1cba 100644
Binary files a/base.png and b/base.png differ
diff --git a/index.html b/index.html
index b933a8e..4e7d7ce 100644
--- a/index.html
+++ b/index.html
@@ -8,7 +8,7 @@
diff --git a/js/index.js b/js/index.js
index 8edab80..9acb634 100644
--- a/js/index.js
+++ b/js/index.js
@@ -1,13 +1,22 @@
+const width = 2160;
+const height = 1080;
+
const BIASES = {
- 0xc8ff50: 1,
- 0x46aafa: 0.5,
- 0xff0000: 0.75,
- 0x0000ff: 0.4,
+0x000000: 1,
+ 0x64ff50: 0.5,
+ 0xc8ff50: 0.45,
+ 0x46aafa: 0.4,
+ 0x0078ff: 0.35,
+ 0x0000ff: 0.3,
+ 0xf5a500: 0.15,
+ 0xff0000: 0.1,
+ 0x666666: 0.01,
+ 0xb2b2b2: 0.02
};
function validXY(x, y) {
- if (x < 0 || x >= 3200) return false;
- if (y < 0 || y >= 1600) return false;
+ if (x < 0 || x >= width) return false;
+ if (y < 0 || y >= height) return false;
return true;
}
@@ -26,56 +35,64 @@ function setRGBA(data, i, input) {
function isLand(data) {
if (data[0] == 255 && data[1] == 255 && data[2] == 255 && data[3] == 255) return false;
+ if (data[0] == 0 && data[1] == 0 && data[2] == 0 && data[3] == 255) return false;
return true;
}
function Game(baseMap) {
this.img = new Image();
this.baseMap = baseMap;
+ this.colors = {};
+ this.aggression = {};
}
Game.prototype.main = function() {
var {biomes, ctx, colonized} = this;
- var dat = ctx.getImageData(0,0,3200,1600);
+ var dat = ctx.getImageData(0,0,width,height);
var data = dat.data;
var out = new Uint8Array(4);
- for (let k = 0; k < 3200*1600/10; k++) {
- let i = Math.floor(Math.random() * biomes.data.length / 4);
+ for (let k = 0; k < width*height; k++) {
+ let i = k;
if (!colonized[i]) continue;
- var x = i % 3200;
- var y = Math.floor(i / 3200);
+ var x = i % width;
+ var y = Math.floor(i / width);
let rgba = getRGBA(biomes.data,i,out);
-
+
if (isLand(rgba))
- setRGBA(data,i,[255,128,128,255]);
+ setRGBA(data,i,this.colors[colonized[i]]);
let weight = 10;
let broken = false;
+ let i2 = i;
+
for (let dx = -1; dx <= 1; dx++) {
for (let dy = -1; dy <= 1; dy++ ) {
weight--;
let x2 = x + dx;
let y2 = y + dy;
- let i = x2 + y2 * 3200;
+ let i = x2 + y2 * width;
if (!validXY(x2,y2)) continue;
let rgba = getRGBA(biomes.data,i,out);
let rgbaH = rgba[0] * 0x10000 + rgba[1] * 0x100 + rgba[2];
- if (Math.random() > ((rgbaH in BIASES) ? BIASES[rgbaH] : 0.2) / weight) {
+ let bias = ((rgbaH in BIASES) ? BIASES[rgbaH] : 0.2) / weight;
+ if (colonized[y2 * width + x2] != 0) bias /= this.aggression[colonized[i]];
+
+ if (Math.random() > bias) {
continue;
}
- if (colonized[y2 * 3200 + x2] == 1) {
+ if (colonized[y2 * width + x2] == colonized[i2]) {
continue;
}
- colonized[y2 * 3200 + x2] = 1;
+ colonized[y2 * width + x2] = colonized[i2];
broken = true;
break;
}
@@ -83,12 +100,12 @@ Game.prototype.main = function() {
}
}
- ctx.putImageData(dat,0,0,0,0,3200,1600);
+ ctx.putImageData(dat,0,0,0,0,width,height);
}
Game.prototype.map = function() {
var {biomes, ctx} = this;
- var dat = ctx.getImageData(0,0,3200,1600);
+ var dat = ctx.getImageData(0,0,width,height);
var data = dat.data;
var out = new Uint8Array(4);
@@ -101,8 +118,8 @@ Game.prototype.map = function() {
setRGBA(data,i,[0,0,0,255]);
}
}
-
- ctx.putImageData(dat,0,0,0,0,3200,1600);
+
+ ctx.putImageData(dat,0,0,0,0,width,height);
}
Game.prototype.place = function() {
@@ -111,14 +128,19 @@ Game.prototype.place = function() {
let i = 0;
- while (true) {
- i = Math.floor(Math.random() * biomes.data.length / 4);
+ for (let count = 1; count < 101; count++) {
+ while (true) {
+ i = Math.floor(Math.random() * biomes.data.length / 4);
- let rgba = getRGBA(biomes.data,i,out);
+ let rgba = getRGBA(biomes.data,i,out);
- if (isLand(rgba)) break;
- }
- colonized[i] = 1;
+ if (isLand(rgba)) break;
+ }
+
+ colonized[i] = count;
+ this.aggression[count] = Math.random();
+ this.colors[count] = [Math.floor(Math.random() * 255),Math.floor(Math.random() * 255),Math.floor(Math.random() * 255),255];
+ }
}
Game.prototype.loop = function() {
@@ -132,12 +154,14 @@ Game.prototype.startGame = function() {
this.ctx = ctx;
- ctx.drawImage(this.img,0, 0,3200,1600);
+ ctx.imageSmoothingEnabled = false;
+ ctx.drawImage(this.img,0, 0,width,height);
- var dat = ctx.getImageData(0,0,3200,1600);
+
+ var dat = ctx.getImageData(0,0,width,height);
this.biomes = dat;
- this.colonized = new Uint8Array(3200*1600);
+ this.colonized = new Uint8Array(width*height);
this.map();
this.place();